blob: 62a5f4525d856d02ad1d3f2b66b86811d52cbee6 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:convert';
import 'dart:io';
import 'package:golden_tests_harvester/golden_tests_harvester.dart';
import 'package:path/path.dart' as p;
import 'package:process/src/interface/process_manager.dart';
import 'package:skia_gold_client/skia_gold_client.dart';
const String _kLuciEnvName = 'LUCI_CONTEXT';
bool get isLuciEnv => Platform.environment.containsKey(_kLuciEnvName);
/// Fake SkiaGoldClient that is used if the harvester is run outside of Luci.
class FakeSkiaGoldClient implements SkiaGoldClient {
FakeSkiaGoldClient(this._workingDirectory, {this.dimensions, this.verbose = false});
final Directory _workingDirectory;
@override
final Map<String, String>? dimensions;
@override
final bool verbose;
@override
Future<void> addImg(String testName, File goldenFile,
{double differentPixelsRate = 0.01,
int pixelColorDelta = 0,
required int screenshotSize}) async {
Logger.instance.log(
'addImg testName:$testName goldenFile:${goldenFile.path} screenshotSize:$screenshotSize differentPixelsRate:$differentPixelsRate pixelColorDelta:$pixelColorDelta');
}
@override
Future<void> auth() async {
Logger.instance.log('auth dimensions:${dimensions ?? 'null'}');
}
@override
String cleanTestName(String fileName) {
throw UnimplementedError();
}
@override
List<String> getCIArguments() {
throw UnimplementedError();
}
@override
Future<String?> getExpectationForTest(String testName) {
throw UnimplementedError();
}
@override
Future<List<int>> getImageBytes(String imageHash) {
throw UnimplementedError();
}
@override
String getTraceID(String testName) {
throw UnimplementedError();
}
@override
HttpClient get httpClient => throw UnimplementedError();
@override
ProcessManager get process => throw UnimplementedError();
@override
Directory get workDirectory => _workingDirectory;
}
void _printUsage() {
Logger.instance
.log('dart run ./bin/golden_tests_harvester.dart <working_dir>');
}
Future<void> main(List<String> arguments) async {
if (arguments.length != 1) {
return _printUsage();
}
final Directory workDirectory = Directory(arguments[0]);
final File digest = File(p.join(workDirectory.path, 'digest.json'));
if (!digest.existsSync()) {
Logger.instance
.log('Error: digest.json does not exist in ${workDirectory.path}.');
return;
}
final Object? decoded = jsonDecode(digest.readAsStringSync());
final Map<String?, Object?> data = (decoded as Map<String?, Object?>?)!;
final Map<String, String> dimensions =
(data['dimensions'] as Map<String, Object?>?)!.cast<String, String>();
final List<Object?> entries = (data['entries'] as List<Object?>?)!;
final SkiaGoldClient skiaGoldClient = isLuciEnv
? SkiaGoldClient(workDirectory, dimensions: dimensions)
: FakeSkiaGoldClient(workDirectory, dimensions: dimensions);
await harvest(skiaGoldClient, workDirectory, entries);
}