mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Revert "Make tests more resilient to Skia gold failures and refactor flutter_goldens for extensive technical debt removal (#140101)" (#141814)
Reverts https://github.com/flutter/flutter/pull/140101 That PR somehow made non-matching gold tests not fail at HEAD. Fixes https://github.com/flutter/flutter/issues/141880 - Blocked by https://github.com/flutter/flutter/issues/140169 - https://github.com/flutter/flutter/pull/141427
This commit is contained in:
parent
49447fc68b
commit
77c3807c80
@ -1 +1,7 @@
|
||||
[0-9]+:[0-9]+ [+]0: Local passes non-existent baseline for new test, null expectation *
|
||||
*No expectations provided by Skia Gold for test: library.flutter.new_golden_test.1.png. This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.
|
||||
*Validate image output found at flutter/test/library/
|
||||
[0-9]+:[0-9]+ [+]1: Local passes non-existent baseline for new test, empty expectation *
|
||||
*No expectations provided by Skia Gold for test: library.flutter.new_golden_test.2.png. This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.
|
||||
*Validate image output found at flutter/test/library/
|
||||
[0-9]+:[0-9]+ [+]2: All tests passed! *
|
||||
|
@ -21,7 +21,6 @@ const List<int> _kFailPngBytes = <int>[
|
||||
];
|
||||
|
||||
void main() {
|
||||
final List<String> log = <String>[];
|
||||
final MemoryFileSystem fs = MemoryFileSystem();
|
||||
final Directory basedir = fs.directory('flutter/test/library/')
|
||||
..createSync(recursive: true);
|
||||
@ -35,7 +34,6 @@ void main() {
|
||||
environment: <String, String>{'FLUTTER_ROOT': '/flutter'},
|
||||
operatingSystem: 'macos'
|
||||
),
|
||||
log: log.add,
|
||||
);
|
||||
|
||||
test('Local passes non-existent baseline for new test, null expectation', () async {
|
||||
@ -46,12 +44,6 @@ void main() {
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
expect(log, <String>[
|
||||
// ignore: no_adjacent_strings_in_list
|
||||
'No expectations provided by Skia Gold for test: library.flutter.new_golden_test.1.png. '
|
||||
'This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at flutter/test/library/'
|
||||
]);
|
||||
});
|
||||
|
||||
test('Local passes non-existent baseline for new test, empty expectation', () async {
|
||||
@ -62,16 +54,6 @@ void main() {
|
||||
),
|
||||
isTrue,
|
||||
);
|
||||
expect(log, <String>[
|
||||
// ignore: no_adjacent_strings_in_list
|
||||
'No expectations provided by Skia Gold for test: library.flutter.new_golden_test.1.png. '
|
||||
'This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at flutter/test/library/',
|
||||
// ignore: no_adjacent_strings_in_list
|
||||
'No expectations provided by Skia Gold for test: library.flutter.new_golden_test.2.png. '
|
||||
'This may be a new test. If this is an unexpected result, check https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at flutter/test/library/',
|
||||
]);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -65,7 +65,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -75,4 +75,4 @@ flutter:
|
||||
assets:
|
||||
- icon/test.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 04e8
|
||||
# PUBSPEC CHECKSUM: 8fe9
|
||||
|
@ -75,7 +75,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -86,4 +86,4 @@ flutter:
|
||||
- packages/flutter_gallery_assets/people/square/ali.png
|
||||
- packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 40c1
|
||||
# PUBSPEC CHECKSUM: ebc2
|
||||
|
@ -18,7 +18,7 @@ dependencies:
|
||||
# flutter update-packages --force-upgrade
|
||||
flutter_gallery_assets: 1.0.2
|
||||
|
||||
web: 0.4.1
|
||||
web: 0.4.2
|
||||
|
||||
async: 2.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
boolean_selector: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -213,4 +213,4 @@ flutter:
|
||||
fonts:
|
||||
- asset: packages/flutter_gallery_assets/fonts/GalleryIcons.ttf
|
||||
|
||||
# PUBSPEC CHECKSUM: 40c1
|
||||
# PUBSPEC CHECKSUM: ebc2
|
||||
|
@ -66,7 +66,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -140,4 +140,4 @@ flutter:
|
||||
- packages/flutter_gallery_assets/people/square/stella.png
|
||||
- packages/flutter_gallery_assets/people/square/trevor.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 1e38
|
||||
# PUBSPEC CHECKSUM: a939
|
||||
|
@ -17,7 +17,7 @@ dependencies:
|
||||
characters: 1.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
collection: 1.18.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
crypto: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
ffi: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
ffi: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
http: 0.13.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
http_parser: 4.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
material_color_utilities: 0.8.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -25,7 +25,7 @@ dependencies:
|
||||
path: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_android: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_foundation: 2.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_foundation: 2.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_linux: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_platform_interface: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_windows: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -47,4 +47,4 @@ flutter:
|
||||
androidPackage: com.example.multiple_flutters_module
|
||||
iosBundleIdentifier: com.example.multipleFluttersModule
|
||||
|
||||
# PUBSPEC CHECKSUM: 61ab
|
||||
# PUBSPEC CHECKSUM: 81ae
|
||||
|
@ -67,7 +67,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -77,4 +77,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: c824
|
||||
# PUBSPEC CHECKSUM: 5425
|
||||
|
@ -73,7 +73,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -84,4 +84,4 @@ flutter:
|
||||
- packages/flutter_gallery_assets/people/square/ali.png
|
||||
- packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 40c1
|
||||
# PUBSPEC CHECKSUM: ebc2
|
||||
|
@ -73,7 +73,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -84,4 +84,4 @@ flutter:
|
||||
- packages/flutter_gallery_assets/people/square/ali.png
|
||||
- packages/flutter_gallery_assets/places/india_chettinad_silk_maker.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 40c1
|
||||
# PUBSPEC CHECKSUM: ebc2
|
||||
|
@ -70,7 +70,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -79,4 +79,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: d5e3
|
||||
# PUBSPEC CHECKSUM: 81e4
|
||||
|
@ -66,7 +66,7 @@ dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
xml: 6.5.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -75,4 +75,4 @@ dependencies:
|
||||
dev_dependencies:
|
||||
test_api: 0.6.1
|
||||
|
||||
# PUBSPEC CHECKSUM: 69d9
|
||||
# PUBSPEC CHECKSUM: 09da
|
||||
|
@ -61,9 +61,9 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 4018
|
||||
# PUBSPEC CHECKSUM: cb19
|
||||
|
@ -51,9 +51,9 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 3a63
|
||||
# PUBSPEC CHECKSUM: c564
|
||||
|
@ -21,7 +21,7 @@ dependencies:
|
||||
shelf_static: 1.1.2
|
||||
stack_trace: 1.11.1
|
||||
vm_service: 13.0.0
|
||||
web: 0.4.1
|
||||
web: 0.4.2
|
||||
webkit_inspection_protocol: 1.2.1
|
||||
xml: 6.5.0
|
||||
standard_message_codec: 0.0.1+4
|
||||
@ -73,4 +73,4 @@ dev_dependencies:
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: a647
|
||||
# PUBSPEC CHECKSUM: 4648
|
||||
|
@ -61,7 +61,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -69,4 +69,4 @@ dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 76e0
|
||||
# PUBSPEC CHECKSUM: 02e1
|
||||
|
@ -74,9 +74,9 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -25,13 +25,13 @@ dependencies:
|
||||
async: 2.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
boolean_selector: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
characters: 1.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
ffi: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
ffi: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
file: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
matcher: 0.12.16+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
material_color_utilities: 0.8.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
meta: 1.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_foundation: 2.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_foundation: 2.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_linux: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_platform_interface: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_windows: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -87,7 +87,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -95,4 +95,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 5622
|
||||
# PUBSPEC CHECKSUM: 0f26
|
||||
|
@ -68,7 +68,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -83,4 +83,4 @@ flutter:
|
||||
assets:
|
||||
- customassets/flutter_logo.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -56,7 +56,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -65,4 +65,4 @@ dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 1d69
|
||||
# PUBSPEC CHECKSUM: c86a
|
||||
|
@ -58,7 +58,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -85,4 +85,4 @@ flutter:
|
||||
flavors:
|
||||
- free
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -36,7 +36,7 @@ dependencies:
|
||||
source_span: 1.10.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
term_glyph: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
url_launcher_android: 6.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
url_launcher_ios: 6.2.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
url_launcher_ios: 6.2.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
url_launcher_linux: 3.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
url_launcher_macos: 3.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
url_launcher_platform_interface: 2.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -44,10 +44,10 @@ dependencies:
|
||||
url_launcher_windows: 3.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
video_player_android: 2.4.11 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
video_player_avfoundation: 2.5.5 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
video_player_avfoundation: 2.5.6 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
video_player_platform_interface: 6.2.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
video_player_web: 2.1.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
@ -277,4 +277,4 @@ flutter:
|
||||
- asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
|
||||
- asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
|
||||
|
||||
# PUBSPEC CHECKSUM: 7f94
|
||||
# PUBSPEC CHECKSUM: f797
|
||||
|
@ -10,7 +10,7 @@ dependencies:
|
||||
camera: 0.10.5+9
|
||||
|
||||
camera_android: 0.10.8+16 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
camera_avfoundation: 0.9.13+9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
camera_avfoundation: 0.9.13+10 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
camera_platform_interface: 2.7.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
camera_web: 0.3.2+4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
characters: 1.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -22,9 +22,9 @@ dependencies:
|
||||
plugin_platform_interface: 2.1.8 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
stream_transform: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: c4cc
|
||||
# PUBSPEC CHECKSUM: 8ef5
|
||||
|
@ -22,14 +22,14 @@ dependencies:
|
||||
async: 2.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
boolean_selector: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
characters: 1.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
ffi: 2.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
ffi: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
file: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
matcher: 0.12.16+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
material_color_utilities: 0.8.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
meta: 1.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_android: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_foundation: 2.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_foundation: 2.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_linux: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_platform_interface: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path_provider_windows: 2.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -85,7 +85,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -93,4 +93,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 5622
|
||||
# PUBSPEC CHECKSUM: 0f26
|
||||
|
@ -68,7 +68,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -80,4 +80,4 @@ flutter:
|
||||
# the material Icons class.
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -56,7 +56,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -65,4 +65,4 @@ dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 1d69
|
||||
# PUBSPEC CHECKSUM: c86a
|
||||
|
@ -57,7 +57,7 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -79,4 +79,4 @@ flutter:
|
||||
assets:
|
||||
- assets/foo.png
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -82,9 +82,9 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: bf0d
|
||||
# PUBSPEC CHECKSUM: 6b0e
|
||||
|
@ -56,10 +56,10 @@ dependencies:
|
||||
vector_math: 2.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 1d69
|
||||
# PUBSPEC CHECKSUM: c86a
|
||||
|
@ -51,9 +51,9 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 3a63
|
||||
# PUBSPEC CHECKSUM: c564
|
||||
|
@ -53,9 +53,9 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: e75e
|
||||
# PUBSPEC CHECKSUM: 735f
|
||||
|
@ -57,9 +57,9 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 0275
|
||||
# PUBSPEC CHECKSUM: 8d76
|
||||
|
@ -84,7 +84,7 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -93,4 +93,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: a812
|
||||
# PUBSPEC CHECKSUM: 5413
|
||||
|
@ -65,10 +65,10 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -65,7 +65,7 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -74,4 +74,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -65,7 +65,7 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -74,4 +74,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 3f27
|
||||
# PUBSPEC CHECKSUM: ea28
|
||||
|
@ -62,9 +62,9 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 76e0
|
||||
# PUBSPEC CHECKSUM: 02e1
|
||||
|
@ -26,15 +26,14 @@ dev_dependencies:
|
||||
fake_async: 1.3.1
|
||||
# To track memory leaks.
|
||||
leak_tracker_flutter_testing: 2.0.3
|
||||
web: 0.4.1
|
||||
leak_tracker_testing: 2.0.2
|
||||
leak_tracker: 10.0.1
|
||||
web: 0.4.2
|
||||
|
||||
async: 2.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
boolean_selector: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
clock: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
crypto: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
file: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
leak_tracker: 10.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
leak_tracker_testing: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
matcher: 0.12.16+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
platform: 3.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -45,7 +44,6 @@ dev_dependencies:
|
||||
string_scanner: 1.2.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
term_glyph: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
test_api: 0.6.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: a90c
|
||||
# PUBSPEC CHECKSUM: 27ab
|
||||
|
@ -41,10 +41,8 @@ dev_dependencies:
|
||||
sdk: flutter
|
||||
fake_async: 1.3.1
|
||||
|
||||
crypto: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
file: 7.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
platform: 3.1.4 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
process: 5.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: 3680
|
||||
# PUBSPEC CHECKSUM: 4e1f
|
||||
|
@ -70,9 +70,9 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
# PUBSPEC CHECKSUM: ce2f
|
||||
# PUBSPEC CHECKSUM: 7a30
|
||||
|
@ -1,9 +0,0 @@
|
||||
This package is an internal implementation detail for our testing
|
||||
infrastructure. It enables the framework to use the Skia Gold
|
||||
infrastructure for tracking golden image tests.
|
||||
|
||||
See also:
|
||||
|
||||
* https://skia.org/docs/dev/testing/skiagold/
|
||||
* https://flutter-gold.skia.org/
|
||||
* https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package:flutter
|
5
packages/flutter_goldens/dart_test.yaml
Normal file
5
packages/flutter_goldens/dart_test.yaml
Normal file
@ -0,0 +1,5 @@
|
||||
tags:
|
||||
# This tag tells the test framework to not shuffle the test order according to
|
||||
# the --test-randomize-ordering-seed for the suites that have this tag.
|
||||
no-shuffle:
|
||||
allow_test_randomization: false
|
@ -3,28 +3,23 @@
|
||||
// found in the LICENSE file.
|
||||
|
||||
import 'dart:async' show FutureOr;
|
||||
import 'dart:io' as io;
|
||||
import 'dart:io' as io show OSError, SocketException;
|
||||
|
||||
import 'package:file/file.dart';
|
||||
import 'package:file/local.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_goldens_client/skia_client.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:platform/platform.dart';
|
||||
import 'package:process/process.dart';
|
||||
|
||||
import 'skia_client.dart';
|
||||
export 'skia_client.dart';
|
||||
export 'package:flutter_goldens_client/skia_client.dart';
|
||||
|
||||
// If you are here trying to figure out how to use golden files in the Flutter
|
||||
// repo itself, consider reading this wiki page:
|
||||
// https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package%3Aflutter
|
||||
|
||||
const String _kFlutterRootKey = 'FLUTTER_ROOT';
|
||||
|
||||
bool _isMainBranch(String? branch) {
|
||||
return branch == 'main'
|
||||
|| branch == 'master';
|
||||
}
|
||||
final RegExp _kMainBranch = RegExp(r'master|main');
|
||||
|
||||
/// Main method that can be used in a `flutter_test_config.dart` file to set
|
||||
/// [goldenFileComparator] to an instance of [FlutterGoldenFileComparator] that
|
||||
@ -33,51 +28,18 @@ bool _isMainBranch(String? branch) {
|
||||
///
|
||||
/// When set, the `namePrefix` is prepended to the names of all gold images.
|
||||
Future<void> testExecutable(FutureOr<void> Function() testMain, {String? namePrefix}) async {
|
||||
assert(goldenFileComparator is LocalFileComparator);
|
||||
const Platform platform = LocalPlatform();
|
||||
const FileSystem fs = LocalFileSystem();
|
||||
const ProcessManager process = LocalProcessManager();
|
||||
final io.HttpClient httpClient = io.HttpClient();
|
||||
if (FlutterPostSubmitFileComparator.isRecommendedForEnvironment(platform)) {
|
||||
goldenFileComparator = await FlutterPostSubmitFileComparator.fromLocalFileComparator(
|
||||
localFileComparator: goldenFileComparator as LocalFileComparator,
|
||||
namePrefix: namePrefix,
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
process: process,
|
||||
httpClient: httpClient,
|
||||
log: print,
|
||||
);
|
||||
} else if (FlutterPreSubmitFileComparator.isRecommendedForEnvironment(platform)) {
|
||||
goldenFileComparator = await FlutterPreSubmitFileComparator.fromLocalFileComparator(
|
||||
localFileComparator: goldenFileComparator as LocalFileComparator,
|
||||
namePrefix: namePrefix,
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
process: process,
|
||||
httpClient: httpClient,
|
||||
log: print,
|
||||
);
|
||||
} else if (FlutterSkippingFileComparator.isRecommendedForEnvironment(platform)) {
|
||||
goldenFileComparator = FlutterSkippingFileComparator.fromLocalFileComparator(
|
||||
localFileComparator: goldenFileComparator as LocalFileComparator,
|
||||
namePrefix: namePrefix,
|
||||
reason: 'Golden file testing is not executed on Cirrus, or LUCI environments outside of flutter/flutter.',
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
process: process,
|
||||
httpClient: httpClient,
|
||||
log: print,
|
||||
if (FlutterPostSubmitFileComparator.isAvailableForEnvironment(platform)) {
|
||||
goldenFileComparator = await FlutterPostSubmitFileComparator.fromDefaultComparator(platform, namePrefix: namePrefix);
|
||||
} else if (FlutterPreSubmitFileComparator.isAvailableForEnvironment(platform)) {
|
||||
goldenFileComparator = await FlutterPreSubmitFileComparator.fromDefaultComparator(platform, namePrefix: namePrefix);
|
||||
} else if (FlutterSkippingFileComparator.isAvailableForEnvironment(platform)) {
|
||||
goldenFileComparator = FlutterSkippingFileComparator.fromDefaultComparator(
|
||||
'Golden file testing is not executed on Cirrus, or LUCI environments outside of flutter/flutter.',
|
||||
namePrefix: namePrefix
|
||||
);
|
||||
} else {
|
||||
goldenFileComparator = await FlutterLocalFileComparator.fromLocalFileComparator(
|
||||
localFileComparator: goldenFileComparator as LocalFileComparator,
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
process: process,
|
||||
httpClient: httpClient,
|
||||
log: print,
|
||||
);
|
||||
goldenFileComparator = await FlutterLocalFileComparator.fromDefaultComparator(platform);
|
||||
}
|
||||
|
||||
await testMain();
|
||||
@ -126,12 +88,12 @@ abstract class FlutterGoldenFileComparator extends GoldenFileComparator {
|
||||
///
|
||||
/// The [fs] and [platform] parameters are useful in tests, where the default
|
||||
/// file system and platform can be replaced by mock instances.
|
||||
@visibleForTesting
|
||||
FlutterGoldenFileComparator(
|
||||
this.basedir,
|
||||
this.skiaClient, {
|
||||
required this.fs,
|
||||
required this.platform,
|
||||
required this.log,
|
||||
this.fs = const LocalFileSystem(),
|
||||
this.platform = const LocalPlatform(),
|
||||
this.namePrefix,
|
||||
});
|
||||
|
||||
@ -151,9 +113,6 @@ abstract class FlutterGoldenFileComparator extends GoldenFileComparator {
|
||||
@visibleForTesting
|
||||
final Platform platform;
|
||||
|
||||
/// The logging function to use when reporting messages to the console.
|
||||
final LogCallback log;
|
||||
|
||||
/// The prefix that is added to all golden names.
|
||||
final String? namePrefix;
|
||||
|
||||
@ -176,11 +135,11 @@ abstract class FlutterGoldenFileComparator extends GoldenFileComparator {
|
||||
@protected
|
||||
@visibleForTesting
|
||||
static Directory getBaseDirectory(
|
||||
LocalFileComparator defaultComparator, {
|
||||
LocalFileComparator defaultComparator,
|
||||
Platform platform, {
|
||||
String? suffix,
|
||||
required Platform platform,
|
||||
required FileSystem fs,
|
||||
}) {
|
||||
const FileSystem fs = LocalFileSystem();
|
||||
final Directory flutterRoot = fs.directory(platform.environment[_kFlutterRootKey]);
|
||||
Directory comparisonRoot;
|
||||
|
||||
@ -255,48 +214,34 @@ class FlutterPostSubmitFileComparator extends FlutterGoldenFileComparator {
|
||||
FlutterPostSubmitFileComparator(
|
||||
super.basedir,
|
||||
super.skiaClient, {
|
||||
required super.fs,
|
||||
required super.platform,
|
||||
required super.log,
|
||||
super.fs,
|
||||
super.platform,
|
||||
super.namePrefix,
|
||||
});
|
||||
|
||||
/// Creates a new [FlutterPostSubmitFileComparator] that mirrors the relative
|
||||
/// path resolution of the default [goldenFileComparator].
|
||||
static Future<FlutterPostSubmitFileComparator> fromLocalFileComparator({
|
||||
required LocalFileComparator localFileComparator,
|
||||
///
|
||||
/// The [goldens] and [defaultComparator] parameters are visible for testing
|
||||
/// purposes only.
|
||||
static Future<FlutterPostSubmitFileComparator> fromDefaultComparator(
|
||||
final Platform platform, {
|
||||
SkiaGoldClient? goldens,
|
||||
LocalFileComparator? defaultComparator,
|
||||
String? namePrefix,
|
||||
required Platform platform,
|
||||
required FileSystem fs,
|
||||
required ProcessManager process,
|
||||
required io.HttpClient httpClient,
|
||||
required LogCallback log,
|
||||
}) async {
|
||||
|
||||
defaultComparator ??= goldenFileComparator as LocalFileComparator;
|
||||
final Directory baseDirectory = FlutterGoldenFileComparator.getBaseDirectory(
|
||||
localFileComparator,
|
||||
defaultComparator,
|
||||
platform,
|
||||
suffix: 'flutter_goldens_postsubmit.',
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
);
|
||||
baseDirectory.createSync(recursive: true);
|
||||
|
||||
final SkiaGoldClient goldens = SkiaGoldClient(
|
||||
baseDirectory,
|
||||
fs: fs,
|
||||
process: process,
|
||||
platform: platform,
|
||||
httpClient: httpClient,
|
||||
log: log,
|
||||
);
|
||||
goldens ??= SkiaGoldClient(baseDirectory);
|
||||
await goldens.auth();
|
||||
return FlutterPostSubmitFileComparator(
|
||||
baseDirectory.uri,
|
||||
goldens,
|
||||
fs: fs,
|
||||
platform: platform,
|
||||
log: log,
|
||||
namePrefix: namePrefix,
|
||||
);
|
||||
return FlutterPostSubmitFileComparator(baseDirectory.uri, goldens, namePrefix: namePrefix);
|
||||
}
|
||||
|
||||
@override
|
||||
@ -305,17 +250,21 @@ class FlutterPostSubmitFileComparator extends FlutterGoldenFileComparator {
|
||||
golden = _addPrefix(golden);
|
||||
await update(golden, imageBytes);
|
||||
final File goldenFile = getGoldenFile(golden);
|
||||
await skiaClient.imgtestAdd(golden.path, goldenFile); // throws if the result is false
|
||||
return true;
|
||||
|
||||
return skiaClient.imgtestAdd(golden.path, goldenFile);
|
||||
}
|
||||
|
||||
/// Decides based on the current environment if goldens tests should be
|
||||
/// executed through Skia Gold.
|
||||
static bool isRecommendedForEnvironment(Platform platform) {
|
||||
return platform.environment.containsKey('SWARMING_TASK_ID') // Indicates LUCI environment.
|
||||
&& platform.environment.containsKey('GOLDCTL') // Needed to use Gold.
|
||||
&& !platform.environment.containsKey('GOLD_TRYJOB') // Indicates a pre-submit environment on LUCI.
|
||||
&& _isMainBranch(platform.environment['GIT_BRANCH']);
|
||||
static bool isAvailableForEnvironment(Platform platform) {
|
||||
final bool luciPostSubmit = platform.environment.containsKey('SWARMING_TASK_ID')
|
||||
&& platform.environment.containsKey('GOLDCTL')
|
||||
// Luci tryjob environments contain this value to inform the [FlutterPreSubmitComparator].
|
||||
&& !platform.environment.containsKey('GOLD_TRYJOB')
|
||||
// Only run on main branch.
|
||||
&& _kMainBranch.hasMatch(platform.environment['GIT_BRANCH'] ?? '');
|
||||
|
||||
return luciPostSubmit;
|
||||
}
|
||||
}
|
||||
|
||||
@ -342,49 +291,41 @@ class FlutterPreSubmitFileComparator extends FlutterGoldenFileComparator {
|
||||
FlutterPreSubmitFileComparator(
|
||||
super.basedir,
|
||||
super.skiaClient, {
|
||||
required super.fs,
|
||||
required super.platform,
|
||||
required super.log,
|
||||
super.fs,
|
||||
super.platform,
|
||||
super.namePrefix,
|
||||
});
|
||||
|
||||
/// Creates a new [FlutterPreSubmitFileComparator] that mirrors the
|
||||
/// relative path resolution of the default [goldenFileComparator].
|
||||
static Future<FlutterGoldenFileComparator> fromLocalFileComparator({
|
||||
required LocalFileComparator localFileComparator,
|
||||
///
|
||||
/// The [goldens] and [defaultComparator] parameters are visible for testing
|
||||
/// purposes only.
|
||||
static Future<FlutterGoldenFileComparator> fromDefaultComparator(
|
||||
final Platform platform, {
|
||||
SkiaGoldClient? goldens,
|
||||
LocalFileComparator? defaultComparator,
|
||||
Directory? testBasedir,
|
||||
String? namePrefix,
|
||||
required Platform platform,
|
||||
required FileSystem fs,
|
||||
required ProcessManager process,
|
||||
required io.HttpClient httpClient,
|
||||
required LogCallback log,
|
||||
}) async {
|
||||
|
||||
defaultComparator ??= goldenFileComparator as LocalFileComparator;
|
||||
final Directory baseDirectory = testBasedir ?? FlutterGoldenFileComparator.getBaseDirectory(
|
||||
localFileComparator,
|
||||
defaultComparator,
|
||||
platform,
|
||||
suffix: 'flutter_goldens_presubmit.',
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
);
|
||||
|
||||
if (!baseDirectory.existsSync()) {
|
||||
baseDirectory.createSync(recursive: true);
|
||||
}
|
||||
|
||||
final SkiaGoldClient goldens = SkiaGoldClient(
|
||||
baseDirectory,
|
||||
fs: fs,
|
||||
process: process,
|
||||
platform: platform,
|
||||
httpClient: httpClient,
|
||||
log: log,
|
||||
);
|
||||
goldens ??= SkiaGoldClient(baseDirectory);
|
||||
|
||||
await goldens.auth();
|
||||
return FlutterPreSubmitFileComparator(
|
||||
baseDirectory.uri,
|
||||
goldens,
|
||||
fs: fs,
|
||||
platform: platform,
|
||||
log: log,
|
||||
goldens, platform: platform,
|
||||
namePrefix: namePrefix,
|
||||
);
|
||||
}
|
||||
@ -405,19 +346,21 @@ class FlutterPreSubmitFileComparator extends FlutterGoldenFileComparator {
|
||||
|
||||
/// Decides based on the current environment if goldens tests should be
|
||||
/// executed as pre-submit tests with Skia Gold.
|
||||
static bool isRecommendedForEnvironment(Platform platform) {
|
||||
return platform.environment.containsKey('SWARMING_TASK_ID') // Indicates LUCI environment.
|
||||
&& platform.environment.containsKey('GOLDCTL') // Needed to use Gold.
|
||||
&& platform.environment.containsKey('GOLD_TRYJOB') // Indicates a pre-submit environment on LUCI.
|
||||
&& _isMainBranch(platform.environment['GIT_BRANCH']);
|
||||
static bool isAvailableForEnvironment(Platform platform) {
|
||||
final bool luciPreSubmit = platform.environment.containsKey('SWARMING_TASK_ID')
|
||||
&& platform.environment.containsKey('GOLDCTL')
|
||||
&& platform.environment.containsKey('GOLD_TRYJOB')
|
||||
// Only run on the main branch
|
||||
&& _kMainBranch.hasMatch(platform.environment['GIT_BRANCH'] ?? '');
|
||||
return luciPreSubmit;
|
||||
}
|
||||
}
|
||||
|
||||
/// A [FlutterGoldenFileComparator] for testing conditions that do not execute
|
||||
/// golden file tests.
|
||||
///
|
||||
/// Currently, this comparator is used on Cirrus, or in Luci environments when
|
||||
/// executing tests outside of the flutter/flutter repository.
|
||||
/// Currently, this comparator is used on Cirrus, or in Luci environments when executing tests
|
||||
/// outside of the flutter/flutter repository.
|
||||
///
|
||||
/// See also:
|
||||
///
|
||||
@ -436,9 +379,6 @@ class FlutterSkippingFileComparator extends FlutterGoldenFileComparator {
|
||||
super.basedir,
|
||||
super.skiaClient,
|
||||
this.reason, {
|
||||
required super.fs,
|
||||
required super.platform,
|
||||
required super.log,
|
||||
super.namePrefix,
|
||||
});
|
||||
|
||||
@ -447,39 +387,25 @@ class FlutterSkippingFileComparator extends FlutterGoldenFileComparator {
|
||||
|
||||
/// Creates a new [FlutterSkippingFileComparator] that mirrors the
|
||||
/// relative path resolution of the default [goldenFileComparator].
|
||||
static FlutterSkippingFileComparator fromLocalFileComparator({
|
||||
required LocalFileComparator localFileComparator,
|
||||
static FlutterSkippingFileComparator fromDefaultComparator(
|
||||
String reason, {
|
||||
LocalFileComparator? defaultComparator,
|
||||
String? namePrefix,
|
||||
required String reason,
|
||||
required FileSystem fs,
|
||||
required ProcessManager process,
|
||||
required Platform platform,
|
||||
required io.HttpClient httpClient,
|
||||
required LogCallback log,
|
||||
}) {
|
||||
final Uri basedir = localFileComparator.basedir;
|
||||
final SkiaGoldClient skiaClient = SkiaGoldClient(
|
||||
fs.directory(basedir),
|
||||
fs: fs,
|
||||
process: process,
|
||||
platform: platform,
|
||||
httpClient: httpClient,
|
||||
log: log,
|
||||
);
|
||||
return FlutterSkippingFileComparator(
|
||||
basedir,
|
||||
skiaClient,
|
||||
reason,
|
||||
fs: fs,
|
||||
platform: platform,
|
||||
log: log,
|
||||
namePrefix: namePrefix,
|
||||
);
|
||||
defaultComparator ??= goldenFileComparator as LocalFileComparator;
|
||||
const FileSystem fs = LocalFileSystem();
|
||||
final Uri basedir = defaultComparator.basedir;
|
||||
final SkiaGoldClient skiaClient = SkiaGoldClient(fs.directory(basedir));
|
||||
return FlutterSkippingFileComparator(basedir, skiaClient, reason, namePrefix: namePrefix);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<bool> compare(Uint8List imageBytes, Uri golden) async {
|
||||
log('Auto-passing "$golden" test without checking: $reason');
|
||||
// Ideally we would use markTestSkipped here but in some situations,
|
||||
// comparators are called outside of tests.
|
||||
// See also: https://github.com/flutter/flutter/issues/91285
|
||||
// ignore: avoid_print
|
||||
print('Skipping "$golden" test: $reason');
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -490,10 +416,13 @@ class FlutterSkippingFileComparator extends FlutterGoldenFileComparator {
|
||||
/// used.
|
||||
///
|
||||
/// If we are in a CI environment, LUCI or Cirrus, but are not using the other
|
||||
/// comparators (determined by checking this after the others), we skip.
|
||||
static bool isRecommendedForEnvironment(Platform platform) {
|
||||
return platform.environment.containsKey('SWARMING_TASK_ID') // Indicates LUCI environment.
|
||||
|| platform.environment.containsKey('CIRRUS_CI'); // Indicates Cirrus environment.
|
||||
/// comparators, we skip.
|
||||
static bool isAvailableForEnvironment(Platform platform) {
|
||||
return (platform.environment.containsKey('SWARMING_TASK_ID')
|
||||
// Some builds are still being run on Cirrus, we should skip these.
|
||||
|| platform.environment.containsKey('CIRRUS_CI'))
|
||||
// If we are in CI, skip on branches that are not main.
|
||||
&& !_kMainBranch.hasMatch(platform.environment['GIT_BRANCH'] ?? '');
|
||||
}
|
||||
}
|
||||
|
||||
@ -503,7 +432,7 @@ class FlutterSkippingFileComparator extends FlutterGoldenFileComparator {
|
||||
/// This comparator utilizes the [SkiaGoldClient] to request baseline images for
|
||||
/// the given device under test for comparison. This comparator is initialized
|
||||
/// when conditions for all other [FlutterGoldenFileComparators] have not been
|
||||
/// met, see the `isRecommendedForEnvironment` method for each one listed below.
|
||||
/// met, see the `isAvailableForEnvironment` method for each one listed below.
|
||||
///
|
||||
/// The [FlutterLocalFileComparator] is intended to run on local machines and
|
||||
/// serve as a smoke test during development. As such, it will not be able to
|
||||
@ -532,45 +461,52 @@ class FlutterLocalFileComparator extends FlutterGoldenFileComparator with LocalC
|
||||
FlutterLocalFileComparator(
|
||||
super.basedir,
|
||||
super.skiaClient, {
|
||||
required super.fs,
|
||||
required super.platform,
|
||||
required super.log,
|
||||
super.fs,
|
||||
super.platform,
|
||||
});
|
||||
|
||||
/// Creates a new [FlutterLocalFileComparator] that mirrors the
|
||||
/// relative path resolution of the default [goldenFileComparator].
|
||||
static Future<FlutterGoldenFileComparator> fromLocalFileComparator({
|
||||
required LocalFileComparator localFileComparator,
|
||||
required Platform platform,
|
||||
required FileSystem fs,
|
||||
required ProcessManager process,
|
||||
required io.HttpClient httpClient,
|
||||
required LogCallback log,
|
||||
///
|
||||
/// The [goldens], [defaultComparator], and [baseDirectory] parameters are
|
||||
/// visible for testing purposes only.
|
||||
static Future<FlutterGoldenFileComparator> fromDefaultComparator(
|
||||
final Platform platform, {
|
||||
SkiaGoldClient? goldens,
|
||||
LocalFileComparator? defaultComparator,
|
||||
Directory? baseDirectory,
|
||||
}) async {
|
||||
final Directory baseDirectory = FlutterGoldenFileComparator.getBaseDirectory(
|
||||
localFileComparator,
|
||||
platform: platform,
|
||||
fs: fs,
|
||||
defaultComparator ??= goldenFileComparator as LocalFileComparator;
|
||||
baseDirectory ??= FlutterGoldenFileComparator.getBaseDirectory(
|
||||
defaultComparator,
|
||||
platform,
|
||||
);
|
||||
|
||||
if (!baseDirectory.existsSync()) {
|
||||
baseDirectory.createSync(recursive: true);
|
||||
}
|
||||
|
||||
final SkiaGoldClient goldens = SkiaGoldClient(
|
||||
baseDirectory,
|
||||
fs: fs,
|
||||
process: process,
|
||||
platform: platform,
|
||||
httpClient: httpClient,
|
||||
log: log,
|
||||
);
|
||||
return FlutterLocalFileComparator(
|
||||
baseDirectory.uri,
|
||||
goldens,
|
||||
fs: fs,
|
||||
platform: platform,
|
||||
log: log,
|
||||
);
|
||||
goldens ??= SkiaGoldClient(baseDirectory);
|
||||
try {
|
||||
// Check if we can reach Gold.
|
||||
await goldens.getExpectationForTest('');
|
||||
} on io.OSError catch (_) {
|
||||
return FlutterSkippingFileComparator(
|
||||
baseDirectory.uri,
|
||||
goldens,
|
||||
'OSError occurred, could not reach Gold. '
|
||||
'Switching to FlutterSkippingGoldenFileComparator.',
|
||||
);
|
||||
} on io.SocketException catch (_) {
|
||||
return FlutterSkippingFileComparator(
|
||||
baseDirectory.uri,
|
||||
goldens,
|
||||
'SocketException occurred, could not reach Gold. '
|
||||
'Switching to FlutterSkippingGoldenFileComparator.',
|
||||
);
|
||||
}
|
||||
|
||||
return FlutterLocalFileComparator(baseDirectory.uri, goldens);
|
||||
}
|
||||
|
||||
@override
|
||||
@ -578,24 +514,21 @@ class FlutterLocalFileComparator extends FlutterGoldenFileComparator with LocalC
|
||||
golden = _addPrefix(golden);
|
||||
final String testName = skiaClient.cleanTestName(golden.path);
|
||||
late String? testExpectation;
|
||||
try {
|
||||
testExpectation = await skiaClient.getExpectationForTest(testName);
|
||||
if (testExpectation == null || testExpectation.isEmpty) {
|
||||
log(
|
||||
'No expectations provided by Skia Gold for test: $golden. '
|
||||
'This may be a new test. If this is an unexpected result, check '
|
||||
'https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at $basedir'
|
||||
);
|
||||
update(golden, imageBytes);
|
||||
return true;
|
||||
}
|
||||
} on Exception catch (error) {
|
||||
if (error is! io.SocketException &&
|
||||
error is! io.OSError) {
|
||||
rethrow; // "uncaught error"
|
||||
}
|
||||
log('Auto-passing "$golden" test, ignoring network error when contacting Skia.');
|
||||
testExpectation = await skiaClient.getExpectationForTest(testName);
|
||||
|
||||
if (testExpectation == null || testExpectation.isEmpty) {
|
||||
// There is no baseline for this test.
|
||||
// Ideally we would use markTestSkipped here but in some situations,
|
||||
// comparators are called outside of tests.
|
||||
// See also: https://github.com/flutter/flutter/issues/91285
|
||||
// ignore: avoid_print
|
||||
print(
|
||||
'No expectations provided by Skia Gold for test: $golden. '
|
||||
'This may be a new test. If this is an unexpected result, check '
|
||||
'https://flutter-gold.skia.org.\n'
|
||||
'Validate image output found at $basedir'
|
||||
);
|
||||
update(golden, imageBytes);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -12,24 +12,26 @@ dependencies:
|
||||
sdk: flutter
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
flutter_goldens_client:
|
||||
path: ../flutter_goldens_client
|
||||
file: 7.0.0
|
||||
meta: 1.11.0
|
||||
platform: 3.1.4
|
||||
process: 5.0.2
|
||||
crypto: 3.0.3
|
||||
path: 1.9.0
|
||||
|
||||
async: 2.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
boolean_selector: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
characters: 1.3.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
clock: 1.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
collection: 1.18.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
crypto: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
fake_async: 1.3.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
leak_tracker: 10.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
leak_tracker_flutter_testing: 2.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
leak_tracker_testing: 2.0.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
matcher: 0.12.16+1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
material_color_utilities: 0.8.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
source_span: 1.10.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
stack_trace: 1.11.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
stream_channel: 2.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
@ -1,168 +0,0 @@
|
||||
// Copyright 2014 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 'package:flutter_goldens/flutter_goldens.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:platform/platform.dart';
|
||||
|
||||
enum _Comparator { post, pre, skip, local }
|
||||
|
||||
_Comparator _testRecommendations({
|
||||
bool hasFlutterRoot = false,
|
||||
bool hasLuci = false,
|
||||
bool hasCirrus = false,
|
||||
bool hasGold = false,
|
||||
bool hasTryJob = false,
|
||||
String branch = 'main',
|
||||
String os = 'macos',
|
||||
}) {
|
||||
final Platform platform = FakePlatform(
|
||||
environment: <String, String>{
|
||||
if (hasFlutterRoot)
|
||||
'FLUTTER_ROOT': '/flutter',
|
||||
if (hasLuci)
|
||||
'SWARMING_TASK_ID': '8675309',
|
||||
if (hasCirrus)
|
||||
'CIRRUS_CI': 'true',
|
||||
if (hasCirrus)
|
||||
'CIRRUS_PR': '',
|
||||
if (hasCirrus)
|
||||
'CIRRUS_BRANCH': branch,
|
||||
if (hasGold)
|
||||
'GOLDCTL': 'goldctl',
|
||||
if (hasGold && hasCirrus)
|
||||
'GOLD_SERVICE_ACCOUNT': 'service account...',
|
||||
if (hasTryJob)
|
||||
'GOLD_TRYJOB': 'git/ref/12345/head',
|
||||
'GIT_BRANCH': branch,
|
||||
},
|
||||
operatingSystem: os,
|
||||
);
|
||||
if (FlutterPostSubmitFileComparator.isRecommendedForEnvironment(platform)) {
|
||||
return _Comparator.post;
|
||||
}
|
||||
if (FlutterPreSubmitFileComparator.isRecommendedForEnvironment(platform)) {
|
||||
return _Comparator.pre;
|
||||
}
|
||||
if (FlutterSkippingFileComparator.isRecommendedForEnvironment(platform)) {
|
||||
return _Comparator.skip;
|
||||
}
|
||||
return _Comparator.local;
|
||||
}
|
||||
|
||||
void main() {
|
||||
test('Comparator recommendations - main branch', () {
|
||||
// If we're running locally (no CI), use a local comparator.
|
||||
expect(_testRecommendations(), _Comparator.local);
|
||||
expect(_testRecommendations(hasFlutterRoot: true), _Comparator.local);
|
||||
expect(_testRecommendations(hasGold: true), _Comparator.local);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasGold: true), _Comparator.local);
|
||||
|
||||
// If we don't have gold but are on CI, we skip regardless.
|
||||
expect(_testRecommendations(hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasFlutterRoot: true, hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
|
||||
// On Luci, with Gold, post-submit. Flutter root and Cirrus variables should have no effect.
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true), _Comparator.post);
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasCirrus: true), _Comparator.post);
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasFlutterRoot: true), _Comparator.post);
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasFlutterRoot: true, hasCirrus: true), _Comparator.post);
|
||||
|
||||
// On Luci, with Gold, pre-submit. Flutter root and Cirrus variables should have no effect.
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasTryJob: true), _Comparator.pre);
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.pre);
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasFlutterRoot: true, hasTryJob: true), _Comparator.pre);
|
||||
expect(_testRecommendations(hasGold: true, hasLuci: true, hasFlutterRoot: true, hasCirrus: true, hasTryJob: true), _Comparator.pre);
|
||||
|
||||
// On Cirrus (with Gold and not on Luci), we skip regardless.
|
||||
expect(_testRecommendations(hasCirrus: true, hasGold: true, hasFlutterRoot: true), _Comparator.skip);
|
||||
expect(_testRecommendations(hasCirrus: true, hasGold: true, hasFlutterRoot: true, hasTryJob: true), _Comparator.skip);
|
||||
});
|
||||
|
||||
test('Comparator recommendations - release branch', () {
|
||||
// If we're running locally (no CI), use a local comparator.
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0'), _Comparator.local);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true), _Comparator.local);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true), _Comparator.local);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasGold: true), _Comparator.local);
|
||||
|
||||
// If we don't have gold but are on CI, we skip regardless.
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasFlutterRoot: true, hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
|
||||
// On Luci, with Gold, post-submit. Flutter root and Cirrus variables should have no effect. Branch should make us skip.
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasFlutterRoot: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasFlutterRoot: true, hasCirrus: true), _Comparator.skip);
|
||||
|
||||
// On Luci, with Gold, pre-submit. Flutter root and Cirrus variables should have no effect. Branch should make us skip.
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasFlutterRoot: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasGold: true, hasLuci: true, hasFlutterRoot: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
|
||||
// On Cirrus (with Gold and not on Luci), we skip regardless.
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasCirrus: true, hasGold: true, hasFlutterRoot: true), _Comparator.skip);
|
||||
expect(_testRecommendations(branch: 'flutter-3.16-candidate.0', hasCirrus: true, hasGold: true, hasFlutterRoot: true, hasTryJob: true), _Comparator.skip);
|
||||
});
|
||||
|
||||
test('Comparator recommendations - Linux', () {
|
||||
// If we're running locally (no CI), use a local comparator.
|
||||
expect(_testRecommendations(os: 'linux'), _Comparator.local);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true), _Comparator.local);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true), _Comparator.local);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasGold: true), _Comparator.local);
|
||||
|
||||
// If we don't have gold but are on CI, we skip regardless.
|
||||
expect(_testRecommendations(os: 'linux', hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasLuci: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasLuci: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasLuci: true, hasCirrus: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasFlutterRoot: true, hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.skip);
|
||||
|
||||
// On Luci, with Gold, post-submit. Flutter root and Cirrus variables should have no effect.
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true), _Comparator.post);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasCirrus: true), _Comparator.post);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasFlutterRoot: true), _Comparator.post);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasFlutterRoot: true, hasCirrus: true), _Comparator.post);
|
||||
|
||||
// On Luci, with Gold, pre-submit. Flutter root and Cirrus variables should have no effect.
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasTryJob: true), _Comparator.pre);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasCirrus: true, hasTryJob: true), _Comparator.pre);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasFlutterRoot: true, hasTryJob: true), _Comparator.pre);
|
||||
expect(_testRecommendations(os: 'linux', hasGold: true, hasLuci: true, hasFlutterRoot: true, hasCirrus: true, hasTryJob: true), _Comparator.pre);
|
||||
|
||||
// On Cirrus (with Gold and not on Luci), we skip regardless.
|
||||
expect(_testRecommendations(os: 'linux', hasCirrus: true, hasGold: true, hasFlutterRoot: true), _Comparator.skip);
|
||||
expect(_testRecommendations(os: 'linux', hasCirrus: true, hasGold: true, hasFlutterRoot: true, hasTryJob: true), _Comparator.skip);
|
||||
});
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,90 +0,0 @@
|
||||
// Copyright 2014 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:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io' show HttpClient, ProcessResult;
|
||||
|
||||
import 'package:file/file.dart';
|
||||
import 'package:file/memory.dart';
|
||||
import 'package:flutter_goldens/skia_client.dart';
|
||||
import 'package:flutter_test/flutter_test.dart';
|
||||
import 'package:platform/platform.dart';
|
||||
import 'package:process/process.dart';
|
||||
|
||||
void main() {
|
||||
test('502 retry', () async {
|
||||
final List<String> log = <String>[];
|
||||
await runZoned(
|
||||
zoneSpecification: ZoneSpecification(
|
||||
print: (Zone self, ZoneDelegate parent, Zone zone, String line) {
|
||||
fail('unexpected print: "$line"');
|
||||
},
|
||||
createTimer: (Zone self, ZoneDelegate parent, Zone zone, Duration duration, void Function() f) {
|
||||
log.add('CREATED TIMER: $duration');
|
||||
return parent.createTimer(zone, Duration.zero, f);
|
||||
},
|
||||
),
|
||||
() async {
|
||||
final FileSystem fs;
|
||||
final SkiaGoldClient skiaClient = SkiaGoldClient(
|
||||
fs: fs = MemoryFileSystem(),
|
||||
process: FakeProcessManager(log),
|
||||
platform: FakePlatform(
|
||||
environment: const <String, String>{
|
||||
'GOLDCTL': 'goldctl',
|
||||
},
|
||||
),
|
||||
httpClient: FakeHttpClient(),
|
||||
log: log.add,
|
||||
fs.directory('/'),
|
||||
);
|
||||
log.add('START'); // ignore: avoid_print
|
||||
await skiaClient.tryjobAdd('test', fs.file('golden'));
|
||||
log.add('END'); // ignore: avoid_print
|
||||
expect(log, <String>[
|
||||
'START',
|
||||
'EXEC: goldctl imgtest add --work-dir /temp --test-name t --png-file golden',
|
||||
'Transient failure (exit code 1) from Skia Gold.',
|
||||
'',
|
||||
'stdout from gold:',
|
||||
' test resulted in a 502: 502 Bad Gateway',
|
||||
' ',
|
||||
'',
|
||||
'Retrying in 5 seconds.',
|
||||
'CREATED TIMER: 0:00:05.000000',
|
||||
'EXEC: goldctl imgtest add --work-dir /temp --test-name t --png-file golden',
|
||||
'END',
|
||||
]);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
class FakeProcessManager extends Fake implements ProcessManager {
|
||||
FakeProcessManager(this.log);
|
||||
|
||||
final List<String> log;
|
||||
int _index = 0;
|
||||
|
||||
@override
|
||||
Future<ProcessResult> run(List<Object> command, {
|
||||
Map<String, String>? environment,
|
||||
bool includeParentEnvironment = true,
|
||||
bool runInShell = false,
|
||||
Encoding? stderrEncoding,
|
||||
Encoding? stdoutEncoding,
|
||||
String? workingDirectory,
|
||||
}) async {
|
||||
log.add('EXEC: ${command.join(' ')}');
|
||||
_index += 1;
|
||||
switch (_index) {
|
||||
case 1: return ProcessResult(0, 1, 'test resulted in a 502: 502 Bad Gateway\n', '');
|
||||
case 2: return ProcessResult(0, 0, '200', '');
|
||||
default: throw StateError('unexpected call to run');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class FakeHttpClient extends Fake implements HttpClient { }
|
@ -7,6 +7,7 @@ import 'dart:io' as io;
|
||||
|
||||
import 'package:crypto/crypto.dart';
|
||||
import 'package:file/file.dart';
|
||||
import 'package:file/local.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:platform/platform.dart';
|
||||
import 'package:process/process.dart';
|
||||
@ -21,17 +22,6 @@ const String _kTestBrowserKey = 'FLUTTER_TEST_BROWSER';
|
||||
const String _kWebRendererKey = 'FLUTTER_WEB_RENDERER';
|
||||
const String _kImpellerKey = 'FLUTTER_TEST_IMPELLER';
|
||||
|
||||
/// Signature of callbacks used to inject [print] replacements.
|
||||
typedef LogCallback = void Function(String);
|
||||
|
||||
/// Signature of callbacks used to determine if a Skia Gold command succeeded,
|
||||
/// and if not, what the error message should be.
|
||||
///
|
||||
/// Return null if the given arguments indicate success.
|
||||
///
|
||||
/// Otherwise, return the error message to show.
|
||||
typedef SkiaErrorCallback = String? Function(int exitCode, String stdout, String stderr);
|
||||
|
||||
/// Exception thrown when an error is returned from the [SkiaClient].
|
||||
class SkiaException implements Exception {
|
||||
/// Creates a new `SkiaException` with a required error [message].
|
||||
@ -51,14 +41,16 @@ class SkiaException implements Exception {
|
||||
/// Flutter Gold Dashboard.
|
||||
class SkiaGoldClient {
|
||||
/// Creates a [SkiaGoldClient] with the given [workDirectory].
|
||||
///
|
||||
/// All other parameters are optional. They may be provided in tests to
|
||||
/// override the defaults for [fs], [process], [platform], and [httpClient].
|
||||
SkiaGoldClient(
|
||||
this.workDirectory, {
|
||||
required this.fs,
|
||||
required this.process,
|
||||
required this.platform,
|
||||
required this.httpClient,
|
||||
required this.log,
|
||||
});
|
||||
this.fs = const LocalFileSystem(),
|
||||
this.process = const LocalProcessManager(),
|
||||
this.platform = const LocalPlatform(),
|
||||
io.HttpClient? httpClient,
|
||||
}) : httpClient = httpClient ?? io.HttpClient();
|
||||
|
||||
/// The file system to use for storing the local clone of the repository.
|
||||
///
|
||||
@ -66,6 +58,12 @@ class SkiaGoldClient {
|
||||
/// replaced by a memory file system.
|
||||
final FileSystem fs;
|
||||
|
||||
/// A wrapper for the [dart:io.Platform] API.
|
||||
///
|
||||
/// This is useful in tests, where the system platform (the default) can be
|
||||
/// replaced by a mock platform instance.
|
||||
final Platform platform;
|
||||
|
||||
/// A controller for launching sub-processes.
|
||||
///
|
||||
/// This is useful in tests, where the real process manager (the default) can
|
||||
@ -73,18 +71,9 @@ class SkiaGoldClient {
|
||||
/// sub-processes.
|
||||
final ProcessManager process;
|
||||
|
||||
/// A wrapper for the [dart:io.Platform] API.
|
||||
///
|
||||
/// This is useful in tests, where the system platform (the default) can be
|
||||
/// replaced by a mock platform instance.
|
||||
final Platform platform;
|
||||
|
||||
/// A client for making Http requests to the Flutter Gold dashboard.
|
||||
final io.HttpClient httpClient;
|
||||
|
||||
/// The logging function to use when reporting messages to the console.
|
||||
final void Function(String message) log;
|
||||
|
||||
/// The local [Directory] within the [comparisonRoot] for the current test
|
||||
/// context. In this directory, the client will create image and JSON files
|
||||
/// for the goldctl tool to use.
|
||||
@ -103,117 +92,38 @@ class SkiaGoldClient {
|
||||
/// Uses the [platform] environment in this implementation.
|
||||
String get _goldctl => platform.environment[_kGoldctlKey]!;
|
||||
|
||||
static void _indent(LogCallback writeln, String text) {
|
||||
if (text.isEmpty) {
|
||||
writeln(' <empty>');
|
||||
} else {
|
||||
for (final String line in text.split('\n')) {
|
||||
writeln(' $line');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void _dump(LogCallback writeln, String data, String label) {
|
||||
if (data.isNotEmpty) {
|
||||
writeln('');
|
||||
writeln('$label:');
|
||||
_indent(writeln, data);
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> _retry({
|
||||
required Future<io.ProcessResult> Function() task,
|
||||
required String taskName,
|
||||
SkiaErrorCallback? errorMessage,
|
||||
}) async {
|
||||
Duration delay = const Duration(seconds: 5);
|
||||
while (true) {
|
||||
final io.ProcessResult result = await task();
|
||||
final String resultStdout = result.stdout as String;
|
||||
final String resultStderr = result.stderr as String;
|
||||
|
||||
if (result.exitCode != 0 && resultStdout.contains('resulted in a 502: 502 Bad Gateway')) {
|
||||
// Probably a transient error, try again.
|
||||
// (See https://issues.skia.org/issues/40044713)
|
||||
//
|
||||
// This could have false-positives, because there's no standard format
|
||||
// for the error messages from Skia gold. Maybe the test name is output
|
||||
// and the test name contains the string above, who knows. For now it
|
||||
// seems more likely that the server is flaking than that there's a
|
||||
// false positive, and false positives seem less likely to be flaky so
|
||||
// we're likely to catch them when they happen.
|
||||
log('Transient failure (exit code ${result.exitCode}) from Skia Gold.');
|
||||
_dump(log, resultStdout, 'stdout from gold');
|
||||
_dump(log, resultStderr, 'stderr from gold');
|
||||
log('');
|
||||
log('Retrying in ${delay.inSeconds} seconds.');
|
||||
await Future<void>.delayed(delay);
|
||||
delay *= 2;
|
||||
continue; // retry
|
||||
}
|
||||
|
||||
String? message;
|
||||
if (errorMessage != null) {
|
||||
message = errorMessage(result.exitCode, resultStdout, resultStderr);
|
||||
if (message == null) {
|
||||
return; // success
|
||||
}
|
||||
} else {
|
||||
if (result.exitCode == 0) {
|
||||
return; // success
|
||||
}
|
||||
}
|
||||
|
||||
final StringBuffer buffer = StringBuffer();
|
||||
if (message != null) {
|
||||
buffer.writeln(message);
|
||||
buffer.writeln();
|
||||
}
|
||||
buffer.writeln('$taskName failed with exit code ${result.exitCode}.');
|
||||
_dump(buffer.writeln, resultStdout, 'stdout from gold');
|
||||
_dump(buffer.writeln, resultStderr, 'stderr from gold');
|
||||
final File resultFile = workDirectory.childFile('result-state.json');
|
||||
if (await resultFile.exists()) {
|
||||
_dump(buffer.writeln, resultFile.readAsStringSync(), 'result-state.json contents');
|
||||
}
|
||||
throw SkiaException(buffer.toString()); // failure
|
||||
}
|
||||
}
|
||||
|
||||
/// Prepares the local work space for golden file testing and calls the
|
||||
/// goldctl `auth` command.
|
||||
///
|
||||
/// This ensures that the goldctl tool is authorized and ready for testing.
|
||||
/// Used by the [FlutterPostSubmitFileComparator] and the
|
||||
/// [FlutterPreSubmitFileComparator].
|
||||
///
|
||||
/// Does nothing if [clientIsAuthorized] returns true.
|
||||
Future<void> auth() async {
|
||||
if (await clientIsAuthorized()) {
|
||||
return;
|
||||
}
|
||||
final List<String> authCommand = <String>[
|
||||
_goldctl,
|
||||
'auth',
|
||||
'--work-dir', workDirectory
|
||||
.childDirectory('temp')
|
||||
.path,
|
||||
'--luci',
|
||||
];
|
||||
|
||||
await _retry(
|
||||
task: () => process.run(<String>[
|
||||
_goldctl,
|
||||
'auth',
|
||||
'--work-dir', workDirectory
|
||||
.childDirectory('temp')
|
||||
.path,
|
||||
'--luci',
|
||||
]),
|
||||
taskName: 'auth',
|
||||
errorMessage: (int exitCode, String resultStdout, String resultStderr) {
|
||||
if (exitCode == 0) {
|
||||
return null;
|
||||
}
|
||||
return 'Skia Gold authorization failed.\n'
|
||||
'\n'
|
||||
'Luci environments authenticate using the file provided by '
|
||||
'LUCI_CONTEXT. There may be an error with this file or Gold '
|
||||
'authentication.';
|
||||
},
|
||||
);
|
||||
final io.ProcessResult result = await process.run(authCommand);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
final StringBuffer buf = StringBuffer()
|
||||
..writeln('Skia Gold authorization failed.')
|
||||
..writeln('Luci environments authenticate using the file provided '
|
||||
'by LUCI_CONTEXT. There may be an error with this file or Gold '
|
||||
'authentication.')
|
||||
..writeln('Debug information for Gold --------------------------------')
|
||||
..writeln('stdout: ${result.stdout}')
|
||||
..writeln('stderr: ${result.stderr}');
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
}
|
||||
|
||||
/// Signals if this client is initialized for uploading images to the Gold
|
||||
@ -229,8 +139,6 @@ class SkiaGoldClient {
|
||||
/// The `imgtest` command collects and uploads test results to the Skia Gold
|
||||
/// backend, the `init` argument initializes the current test. Used by the
|
||||
/// [FlutterPostSubmitFileComparator].
|
||||
///
|
||||
/// This function is idempotent.
|
||||
Future<void> imgtestInit() async {
|
||||
// This client has already been initialized
|
||||
if (_initialized) {
|
||||
@ -266,16 +174,20 @@ class SkiaGoldClient {
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
|
||||
await _retry(
|
||||
task: () => process.run(imgtestInitCommand),
|
||||
taskName: 'imgtest init',
|
||||
errorMessage: (int exitCode, String resultStdout, String resultStderr) {
|
||||
if (exitCode == 0) {
|
||||
return null;
|
||||
}
|
||||
return 'An error occurred when initializing golden file test with goldctl.';
|
||||
},
|
||||
);
|
||||
final io.ProcessResult result = await process.run(imgtestInitCommand);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
_initialized = false;
|
||||
final StringBuffer buf = StringBuffer()
|
||||
..writeln('Skia Gold imgtest init failed.')
|
||||
..writeln('An error occurred when initializing golden file test with ')
|
||||
..writeln('goldctl.')
|
||||
..writeln()
|
||||
..writeln('Debug information for Gold --------------------------------')
|
||||
..writeln('stdout: ${result.stdout}')
|
||||
..writeln('stderr: ${result.stderr}');
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
_initialized = true;
|
||||
}
|
||||
|
||||
@ -286,43 +198,53 @@ class SkiaGoldClient {
|
||||
/// returned from the invocation of this command that indicates a pass or fail
|
||||
/// result.
|
||||
///
|
||||
/// If an unapproved image has made it to post-submit, this throws, to close
|
||||
/// the tree.
|
||||
///
|
||||
/// The [testName] and [goldenFile] parameters reference the current
|
||||
/// comparison being evaluated by the [FlutterPostSubmitFileComparator].
|
||||
Future<void> imgtestAdd(String testName, File goldenFile) async {
|
||||
await _retry(
|
||||
task: () => process.run(<String>[
|
||||
_goldctl,
|
||||
'imgtest', 'add',
|
||||
'--work-dir', workDirectory
|
||||
.childDirectory('temp')
|
||||
.path,
|
||||
'--test-name', cleanTestName(testName),
|
||||
'--png-file', goldenFile.path,
|
||||
'--passfail',
|
||||
..._getPixelMatchingArguments(),
|
||||
]),
|
||||
taskName: 'imgtest add',
|
||||
errorMessage: (int exitCode, String resultStdout, String resultStderr) {
|
||||
if (exitCode == 0) {
|
||||
return null;
|
||||
}
|
||||
if (resultStdout.contains('Untriaged') ||
|
||||
resultStdout.contains('negative image')) {
|
||||
return 'Skia Gold received an unapproved image in post-submit '
|
||||
'testing. Golden file images in flutter/flutter are triaged '
|
||||
'in pre-submit during code review for the given PR.\n'
|
||||
'\n'
|
||||
'Visit https://flutter-gold.skia.org/ to view and approve '
|
||||
'the image(s), or revert the associated change. For more '
|
||||
'information, visit the wiki:\n'
|
||||
' https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package:flutter';
|
||||
}
|
||||
return 'Golden test for "$testName" failed for a reason unrelated to pixel comparison.';
|
||||
},
|
||||
);
|
||||
Future<bool> imgtestAdd(String testName, File goldenFile) async {
|
||||
final List<String> imgtestCommand = <String>[
|
||||
_goldctl,
|
||||
'imgtest', 'add',
|
||||
'--work-dir', workDirectory
|
||||
.childDirectory('temp')
|
||||
.path,
|
||||
'--test-name', cleanTestName(testName),
|
||||
'--png-file', goldenFile.path,
|
||||
'--passfail',
|
||||
..._getPixelMatchingArguments(),
|
||||
];
|
||||
|
||||
final io.ProcessResult result = await process.run(imgtestCommand);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
// If an unapproved image has made it to post-submit, throw to close the
|
||||
// tree.
|
||||
String? resultContents;
|
||||
final File resultFile = workDirectory.childFile(fs.path.join(
|
||||
'result-state.json',
|
||||
));
|
||||
if (await resultFile.exists()) {
|
||||
resultContents = await resultFile.readAsString();
|
||||
}
|
||||
|
||||
final StringBuffer buf = StringBuffer()
|
||||
..writeln('Skia Gold received an unapproved image in post-submit ')
|
||||
..writeln('testing. Golden file images in flutter/flutter are triaged ')
|
||||
..writeln('in pre-submit during code review for the given PR.')
|
||||
..writeln()
|
||||
..writeln('Visit https://flutter-gold.skia.org/ to view and approve ')
|
||||
..writeln('the image(s), or revert the associated change. For more ')
|
||||
..writeln('information, visit the wiki: ')
|
||||
..writeln('https://github.com/flutter/flutter/wiki/Writing-a-golden-file-test-for-package:flutter')
|
||||
..writeln()
|
||||
..writeln('Debug information for Gold --------------------------------')
|
||||
..writeln('stdout: ${result.stdout}')
|
||||
..writeln('stderr: ${result.stderr}')
|
||||
..writeln()
|
||||
..writeln('result-state.json: ${resultContents ?? 'No result file found.'}');
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// Signals if this client is initialized for uploading tryjobs to the Gold
|
||||
@ -338,8 +260,6 @@ class SkiaGoldClient {
|
||||
/// The `imgtest` command collects and uploads test results to the Skia Gold
|
||||
/// backend, the `init` argument initializes the current tryjob. Used by the
|
||||
/// [FlutterPreSubmitFileComparator].
|
||||
///
|
||||
/// This function is idempotent.
|
||||
Future<void> tryjobInit() async {
|
||||
// This client has already been initialized
|
||||
if (_tryjobInitialized) {
|
||||
@ -378,16 +298,20 @@ class SkiaGoldClient {
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
|
||||
await _retry(
|
||||
task: () => process.run(imgtestInitCommand),
|
||||
taskName: 'imgtest init',
|
||||
errorMessage: (int exitCode, String resultStdout, String resultStderr) {
|
||||
if (exitCode == 0) {
|
||||
return null;
|
||||
}
|
||||
return 'An error occurred when initializing golden file tryjob with goldctl.';
|
||||
},
|
||||
);
|
||||
final io.ProcessResult result = await process.run(imgtestInitCommand);
|
||||
|
||||
if (result.exitCode != 0) {
|
||||
_tryjobInitialized = false;
|
||||
final StringBuffer buf = StringBuffer()
|
||||
..writeln('Skia Gold tryjobInit failure.')
|
||||
..writeln('An error occurred when initializing golden file tryjob with ')
|
||||
..writeln('goldctl.')
|
||||
..writeln()
|
||||
..writeln('Debug information for Gold --------------------------------')
|
||||
..writeln('stdout: ${result.stdout}')
|
||||
..writeln('stderr: ${result.stderr}');
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
_tryjobInitialized = true;
|
||||
}
|
||||
|
||||
@ -401,25 +325,42 @@ class SkiaGoldClient {
|
||||
/// The [testName] and [goldenFile] parameters reference the current
|
||||
/// comparison being evaluated by the [FlutterPreSubmitFileComparator].
|
||||
Future<void> tryjobAdd(String testName, File goldenFile) async {
|
||||
await _retry(
|
||||
task: () => process.run(<String>[
|
||||
_goldctl,
|
||||
'imgtest', 'add',
|
||||
'--work-dir', workDirectory.childDirectory('temp').path,
|
||||
'--test-name', cleanTestName(testName),
|
||||
'--png-file', goldenFile.path,
|
||||
..._getPixelMatchingArguments(),
|
||||
]),
|
||||
taskName: 'imgtest add',
|
||||
errorMessage: (int exitCode, String resultStdout, String resultStderr) {
|
||||
if (exitCode == 0 ||
|
||||
resultStdout.contains('Untriaged') ||
|
||||
resultStdout.contains('negative image')) {
|
||||
return null;
|
||||
}
|
||||
return 'Golden test for "$testName" failed for a reason unrelated to pixel comparison.';
|
||||
},
|
||||
);
|
||||
final List<String> imgtestCommand = <String>[
|
||||
_goldctl,
|
||||
'imgtest', 'add',
|
||||
'--work-dir', workDirectory
|
||||
.childDirectory('temp')
|
||||
.path,
|
||||
'--test-name', cleanTestName(testName),
|
||||
'--png-file', goldenFile.path,
|
||||
..._getPixelMatchingArguments(),
|
||||
];
|
||||
|
||||
final io.ProcessResult result = await process.run(imgtestCommand);
|
||||
|
||||
final String/*!*/ resultStdout = result.stdout.toString();
|
||||
if (result.exitCode != 0 &&
|
||||
!(resultStdout.contains('Untriaged') || resultStdout.contains('negative image'))) {
|
||||
String? resultContents;
|
||||
final File resultFile = workDirectory.childFile(fs.path.join(
|
||||
'result-state.json',
|
||||
));
|
||||
if (await resultFile.exists()) {
|
||||
resultContents = await resultFile.readAsString();
|
||||
}
|
||||
final StringBuffer buf = StringBuffer()
|
||||
..writeln('Unexpected Gold tryjobAdd failure.')
|
||||
..writeln('Tryjob execution for golden file test $testName failed for')
|
||||
..writeln('a reason unrelated to pixel comparison.')
|
||||
..writeln()
|
||||
..writeln('Debug information for Gold --------------------------------')
|
||||
..writeln('stdout: ${result.stdout}')
|
||||
..writeln('stderr: ${result.stderr}')
|
||||
..writeln()
|
||||
..writeln()
|
||||
..writeln('result-state.json: ${resultContents ?? 'No result file found.'}');
|
||||
throw SkiaException(buf.toString());
|
||||
}
|
||||
}
|
||||
|
||||
// Constructs arguments for `goldctl` for controlling how pixels are compared.
|
||||
@ -468,45 +409,58 @@ class SkiaGoldClient {
|
||||
}
|
||||
|
||||
/// Returns the latest positive digest for the given test known to Flutter
|
||||
/// Gold at head. Throws without retrying if there's a network failure.
|
||||
/// Gold at head.
|
||||
Future<String?> getExpectationForTest(String testName) async {
|
||||
late String? expectation;
|
||||
final String traceID = getTraceID(testName);
|
||||
final Uri requestForExpectations = Uri.parse(
|
||||
'https://flutter-gold.skia.org/json/v2/latestpositivedigest/$traceID'
|
||||
);
|
||||
String? rawResponse;
|
||||
try {
|
||||
final io.HttpClientRequest request = await httpClient.getUrl(requestForExpectations);
|
||||
final io.HttpClientResponse response = await request.close();
|
||||
rawResponse = await utf8.decodeStream(response);
|
||||
final dynamic jsonResponse = json.decode(rawResponse);
|
||||
if (jsonResponse is! Map<String, dynamic>) {
|
||||
throw const FormatException('Skia gold expectations do not match expected format.');
|
||||
}
|
||||
return jsonResponse['digest'] as String?; // success
|
||||
} on FormatException catch (error) {
|
||||
log(
|
||||
'Formatting error detected requesting expectations from Flutter Gold.\n'
|
||||
'error: $error\n'
|
||||
'url: $requestForExpectations\n'
|
||||
'response: $rawResponse'
|
||||
await io.HttpOverrides.runWithHttpOverrides<Future<void>>(() async {
|
||||
final Uri requestForExpectations = Uri.parse(
|
||||
'https://flutter-gold.skia.org/json/v2/latestpositivedigest/$traceID'
|
||||
);
|
||||
rethrow; // fail
|
||||
}
|
||||
late String rawResponse;
|
||||
try {
|
||||
final io.HttpClientRequest request = await httpClient.getUrl(requestForExpectations);
|
||||
final io.HttpClientResponse response = await request.close();
|
||||
rawResponse = await utf8.decodeStream(response);
|
||||
final dynamic jsonResponse = json.decode(rawResponse);
|
||||
if (jsonResponse is! Map<String, dynamic>) {
|
||||
throw const FormatException('Skia gold expectations do not match expected format.');
|
||||
}
|
||||
expectation = jsonResponse['digest'] as String?;
|
||||
} on FormatException catch (error) {
|
||||
// Ideally we'd use something like package:test's printOnError, but best reliability
|
||||
// in getting logs on CI for now we're just using print.
|
||||
// See also: https://github.com/flutter/flutter/issues/91285
|
||||
print( // ignore: avoid_print
|
||||
'Formatting error detected requesting expectations from Flutter Gold.\n'
|
||||
'error: $error\n'
|
||||
'url: $requestForExpectations\n'
|
||||
'response: $rawResponse'
|
||||
);
|
||||
rethrow;
|
||||
}
|
||||
},
|
||||
SkiaGoldHttpOverrides(),
|
||||
);
|
||||
return expectation;
|
||||
}
|
||||
|
||||
/// Returns a list of bytes representing the golden image retrieved from the
|
||||
/// Flutter Gold dashboard.
|
||||
///
|
||||
/// The provided image hash represents an expectation from Flutter Gold.
|
||||
Future<List<int>> getImageBytes(String imageHash) async {
|
||||
Future<List<int>>getImageBytes(String imageHash) async {
|
||||
final List<int> imageBytes = <int>[];
|
||||
final Uri requestForImage = Uri.parse(
|
||||
'https://flutter-gold.skia.org/img/images/$imageHash.png',
|
||||
await io.HttpOverrides.runWithHttpOverrides<Future<void>>(() async {
|
||||
final Uri requestForImage = Uri.parse(
|
||||
'https://flutter-gold.skia.org/img/images/$imageHash.png',
|
||||
);
|
||||
final io.HttpClientRequest request = await httpClient.getUrl(requestForImage);
|
||||
final io.HttpClientResponse response = await request.close();
|
||||
await response.forEach((List<int> bytes) => imageBytes.addAll(bytes));
|
||||
},
|
||||
SkiaGoldHttpOverrides(),
|
||||
);
|
||||
final io.HttpClientRequest request = await httpClient.getUrl(requestForImage);
|
||||
final io.HttpClientResponse response = await request.close();
|
||||
await response.forEach((List<int> bytes) => imageBytes.addAll(bytes));
|
||||
return imageBytes;
|
||||
}
|
||||
|
||||
@ -561,7 +515,7 @@ class SkiaGoldClient {
|
||||
final File authFile = workDirectory.childFile(fs.path.join(
|
||||
'temp',
|
||||
'auth_opt.json',
|
||||
));
|
||||
))/*!*/;
|
||||
|
||||
if (await authFile.exists()) {
|
||||
final String contents = await authFile.readAsString();
|
||||
@ -623,3 +577,6 @@ class SkiaGoldClient {
|
||||
return md5Sum;
|
||||
}
|
||||
}
|
||||
|
||||
/// Used to make HttpRequests during testing.
|
||||
class SkiaGoldHttpOverrides extends io.HttpOverrides { }
|
22
packages/flutter_goldens_client/pubspec.yaml
Normal file
22
packages/flutter_goldens_client/pubspec.yaml
Normal file
@ -0,0 +1,22 @@
|
||||
name: flutter_goldens_client
|
||||
|
||||
environment:
|
||||
sdk: '>=3.2.0-0 <4.0.0'
|
||||
|
||||
dependencies:
|
||||
# To update these, use "flutter update-packages --force-upgrade".
|
||||
crypto: 3.0.3
|
||||
file: 7.0.0
|
||||
platform: 3.1.4
|
||||
process: 5.0.2
|
||||
|
||||
collection: 1.18.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
meta: 1.11.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
path: 1.9.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
dartdoc:
|
||||
# Exclude this package from the hosted API docs.
|
||||
nodoc: true
|
||||
|
||||
# PUBSPEC CHECKSUM: c72e
|
@ -28,4 +28,6 @@ const Map<String, String> kManuallyPinnedDependencies = <String, String>{
|
||||
'test_api': '0.6.1', // https://github.com/flutter/flutter/issues/140169
|
||||
'test_core': '0.5.9', // https://github.com/flutter/flutter/issues/140169
|
||||
'test': '1.24.9', // https://github.com/flutter/flutter/issues/140169
|
||||
'native_assets_builder': '0.3.0', // https://github.com/flutter/flutter/pull/141814
|
||||
'native_assets_cli': '0.3.2', // https://github.com/flutter/flutter/pull/141814
|
||||
};
|
||||
|
@ -14,7 +14,7 @@ dependencies:
|
||||
args: 2.4.2
|
||||
browser_launcher: 1.1.1
|
||||
dds: 3.1.0+1
|
||||
dwds: 23.1.1
|
||||
dwds: 23.2.0
|
||||
completion: 1.0.1
|
||||
coverage: 1.7.2
|
||||
crypto: 3.0.3
|
||||
@ -101,7 +101,7 @@ dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service_interface: 1.0.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml_edit: 2.1.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
|
||||
dev_dependencies:
|
||||
@ -118,4 +118,4 @@ dartdoc:
|
||||
# Exclude this package from the hosted API docs.
|
||||
nodoc: true
|
||||
|
||||
# PUBSPEC CHECKSUM: eb68
|
||||
# PUBSPEC CHECKSUM: cf69
|
||||
|
@ -55,7 +55,7 @@ dev_dependencies:
|
||||
test_core: 0.5.9 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
yaml: 3.1.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -64,4 +64,4 @@ dartdoc:
|
||||
# Exclude this package from the hosted API docs.
|
||||
nodoc: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 5a6b
|
||||
# PUBSPEC CHECKSUM: e56c
|
||||
|
@ -78,7 +78,7 @@ dev_dependencies:
|
||||
typed_data: 1.3.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
vm_service: 13.0.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
watcher: 1.1.0 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web: 0.4.2 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
web_socket_channel: 2.4.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webdriver: 3.0.3 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
webkit_inspection_protocol: 1.2.1 # THIS LINE IS AUTOGENERATED - TO UPDATE USE "flutter update-packages --force-upgrade"
|
||||
@ -87,4 +87,4 @@ dev_dependencies:
|
||||
flutter:
|
||||
uses-material-design: true
|
||||
|
||||
# PUBSPEC CHECKSUM: 1596
|
||||
# PUBSPEC CHECKSUM: c097
|
||||
|
Loading…
Reference in New Issue
Block a user