diff --git a/lib/web_ui/dev/README.md b/lib/web_ui/dev/README.md index 5903f07e9327a..c230932e9231a 100644 --- a/lib/web_ui/dev/README.md +++ b/lib/web_ui/dev/README.md @@ -41,9 +41,7 @@ felt build [-w] -j 100 If you are a Google employee, you can use an internal instance of Goma to parallelize your builds. Because Goma compiles code on remote servers, this option is effective even on low-powered laptops. -By default, when compiling Dart code to JavaScript, we use 4 `dart2js` workers. -If you need to increase or reduce the number of workers, set the `BUILD_MAX_WORKERS_PER_TASK` -environment variable to the desired number. +By default, when compiling Dart code to JavaScript, we use 8 `dart2js` workers. ## Running web engine tests diff --git a/lib/web_ui/dev/browser_lock.yaml b/lib/web_ui/dev/browser_lock.yaml index 57fbf7a6816fe..3d72c24d2acbb 100644 --- a/lib/web_ui/dev/browser_lock.yaml +++ b/lib/web_ui/dev/browser_lock.yaml @@ -5,7 +5,7 @@ chrome: # is not working with chrome.binary option. Linux: 741412 Mac: 735194 - Win: 735105 + Win: 768975 firefox: version: '72.0' edge: diff --git a/lib/web_ui/dev/chrome_installer.dart b/lib/web_ui/dev/chrome_installer.dart index 6f46c2a57d903..3766488f497dd 100644 --- a/lib/web_ui/dev/chrome_installer.dart +++ b/lib/web_ui/dev/chrome_installer.dart @@ -3,8 +3,11 @@ // found in the LICENSE file. // @dart = 2.6 +import 'dart:async'; import 'dart:io' as io; +import 'package:archive/archive.dart'; +import 'package:archive/archive_io.dart'; import 'package:args/args.dart'; import 'package:http/http.dart'; import 'package:meta/meta.dart'; @@ -186,7 +189,7 @@ class ChromeInstaller { } else if (versionDir.existsSync() && isLuci) { print('INFO: Chrome version directory in LUCI: ' '${versionDir.path}'); - } else if(!versionDir.existsSync() && isLuci) { + } else if (!versionDir.existsSync() && isLuci) { // Chrome should have been deployed as a CIPD package on LUCI. // Throw if it does not exists. throw StateError('Failed to locate Chrome on LUCI on path:' @@ -196,6 +199,8 @@ class ChromeInstaller { versionDir.createSync(recursive: true); } + print('INFO: Starting Chrome download.'); + final String url = PlatformBinding.instance.getChromeDownloadUrl(version); final StreamedResponse download = await client.send(Request( 'GET', @@ -206,17 +211,50 @@ class ChromeInstaller { io.File(path.join(versionDir.path, 'chrome.zip')); await download.stream.pipe(downloadedFile.openWrite()); - final io.ProcessResult unzipResult = await io.Process.run('unzip', [ - downloadedFile.path, - '-d', - versionDir.path, - ]); - - if (unzipResult.exitCode != 0) { - throw BrowserInstallerException( - 'Failed to unzip the downloaded Chrome archive ${downloadedFile.path}.\n' - 'With the version path ${versionDir.path}\n' - 'The unzip process exited with code ${unzipResult.exitCode}.'); + /// Windows LUCI bots does not have a `unzip`. Instead we are + /// using `archive` pub package. + /// + /// We didn't use `archieve` on Mac/Linux since the new files have + /// permission issues. For now we are not able change file permissions + /// from dart. + /// See: https://github.com/dart-lang/sdk/issues/15078. + if (io.Platform.isWindows) { + final Stopwatch stopwatch = Stopwatch()..start(); + + // Read the Zip file from disk. + final bytes = downloadedFile.readAsBytesSync(); + + final Archive archive = ZipDecoder().decodeBytes(bytes); + + // Extract the contents of the Zip archive to disk. + for (final ArchiveFile file in archive) { + final String filename = file.name; + if (file.isFile) { + final data = file.content as List; + io.File(path.join(versionDir.path, filename)) + ..createSync(recursive: true) + ..writeAsBytesSync(data); + } else { + io.Directory(path.join(versionDir.path, filename)) + ..create(recursive: true); + } + } + + stopwatch.stop(); + print('INFO: The unzip took ${stopwatch.elapsedMilliseconds ~/ 1000} seconds.'); + } else { + final io.ProcessResult unzipResult = + await io.Process.run('unzip', [ + downloadedFile.path, + '-d', + versionDir.path, + ]); + if (unzipResult.exitCode != 0) { + throw BrowserInstallerException( + 'Failed to unzip the downloaded Chrome archive ${downloadedFile.path}.\n' + 'With the version path ${versionDir.path}\n' + 'The unzip process exited with code ${unzipResult.exitCode}.'); + } } downloadedFile.deleteSync(); diff --git a/lib/web_ui/dev/common.dart b/lib/web_ui/dev/common.dart index 588fe67eedf6f..511794a1e92f3 100644 --- a/lib/web_ui/dev/common.dart +++ b/lib/web_ui/dev/common.dart @@ -59,11 +59,11 @@ class _WindowsBinding implements PlatformBinding { @override String getChromeDownloadUrl(String version) => - 'https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win%2F${version}%2Fchrome-win32.zip?alt=media'; + 'https://www.googleapis.com/download/storage/v1/b/chromium-browser-snapshots/o/Win%2F${version}%2Fchrome-win.zip?alt=media'; @override String getChromeExecutablePath(io.Directory versionDir) => - path.join(versionDir.path, 'chrome-win32', 'chrome'); + path.join(versionDir.path, 'chrome-win', 'chrome.exe'); @override String getFirefoxDownloadUrl(String version) => diff --git a/lib/web_ui/dev/felt_windows.bat b/lib/web_ui/dev/felt_windows.bat index bacd1b0d50975..2ae0e2ab8b125 100644 --- a/lib/web_ui/dev/felt_windows.bat +++ b/lib/web_ui/dev/felt_windows.bat @@ -57,15 +57,15 @@ IF %orTempValue%==0 ( :: TODO(nurhan): The batch script does not support snanphot option. :: Support snapshot option. CALL :installdeps -IF %1==test (%DART_SDK_DIR%\bin\dart "%DEV_DIR%\felt.dart" %* --browser=edge) ELSE ( %DART_SDK_DIR%\bin\dart "%DEV_DIR%\felt.dart" %* ) +IF %1==test (%DART_SDK_DIR%\bin\dart "%DEV_DIR%\felt.dart" %* --browser=chrome) ELSE ( %DART_SDK_DIR%\bin\dart "%DEV_DIR%\felt.dart" %* ) -EXIT /B 0 +EXIT /B %ERRORLEVEL% :installdeps ECHO "Running \`pub get\` in 'engine/src/flutter/web_sdk/web_engine_tester'" cd "%FLUTTER_DIR%web_sdk\web_engine_tester" CALL %PUB_DIR% get ECHO "Running \`pub get\` in 'engine/src/flutter/lib/web_ui'" -cd %WEB_UI_DIR% +cd %WEB_UI_DIR% CALL %PUB_DIR% get EXIT /B 0 diff --git a/lib/web_ui/dev/test_platform.dart b/lib/web_ui/dev/test_platform.dart index 20e16be900217..341d9b245ee37 100644 --- a/lib/web_ui/dev/test_platform.dart +++ b/lib/web_ui/dev/test_platform.dart @@ -34,7 +34,6 @@ import 'package:test_core/src/runner/environment.dart'; // ignore: implementatio import 'package:test_core/src/util/io.dart'; // ignore: implementation_imports import 'package:test_core/src/runner/configuration.dart'; // ignore: implementation_imports -import 'package:test_core/src/runner/load_exception.dart'; // ignore: implementation_imports import 'package:webkit_inspection_protocol/webkit_inspection_protocol.dart' as wip; @@ -407,15 +406,6 @@ Golden file $filename did not match the image generated by the test. throw ArgumentError('$browser is not a browser.'); } - var htmlPath = p.withoutExtension(path) + '.html'; - if (File(htmlPath).existsSync() && - !File(htmlPath).readAsStringSync().contains('packages/test/dart.js')) { - throw LoadException( - path, - '"${htmlPath}" must contain .'); - } - if (_closed) { return null; } @@ -811,15 +801,18 @@ class BrowserManager { controller = deserializeSuite(path, currentPlatform(_runtime), suiteConfig, await _environment, suiteChannel, message); - final String mapPath = p.join( - env.environment.webUiRootDir.path, - 'build', - '$path.browser_test.dart.js.map', - ); - PackageConfig packageConfig = await loadPackageConfigUri( - await Isolate.packageConfig); - Map packageMap = - {for (var p in packageConfig.packages) p.name: p.packageUriRoot}; + final String sourceMapFileName = + '${p.basename(path)}.browser_test.dart.js.map'; + final String pathToTest = p.dirname(path); + + final String mapPath = p.join(env.environment.webUiRootDir.path, + 'build', pathToTest, sourceMapFileName); + + PackageConfig packageConfig = + await loadPackageConfigUri(await Isolate.packageConfig); + Map packageMap = { + for (var p in packageConfig.packages) p.name: p.packageUriRoot + }; final JSStackTraceMapper mapper = JSStackTraceMapper( await File(mapPath).readAsString(), mapUrl: p.toUri(mapPath), diff --git a/lib/web_ui/dev/test_runner.dart b/lib/web_ui/dev/test_runner.dart index e9f57b32f0153..14a34d5eea4df 100644 --- a/lib/web_ui/dev/test_runner.dart +++ b/lib/web_ui/dev/test_runner.dart @@ -9,6 +9,7 @@ import 'dart:io' as io; import 'package:args/command_runner.dart'; import 'package:meta/meta.dart'; import 'package:path/path.dart' as path; +import 'package:pool/pool.dart'; import 'package:test_core/src/runner/hack_register_platform.dart' as hack; // ignore: implementation_imports import 'package:test_api/src/backend/runtime.dart'; // ignore: implementation_imports @@ -99,6 +100,9 @@ class TestCommand extends Command with ArgUtils { TestTypesRequested testTypesRequested = null; + /// How many dart2js build tasks are running at the same time. + final Pool _pool = Pool(8); + /// Check the flags to see what type of tests are requested. TestTypesRequested findTestType() { if (boolArg('unit-tests-only') && boolArg('integration-tests-only')) { @@ -130,6 +134,7 @@ class TestCommand extends Command with ArgUtils { /// Collect information on the bot. final MacOSInfo macOsInfo = new MacOSInfo(); await macOsInfo.printInformation(); + /// Tests may fail on the CI, therefore exit test_runner. if (isLuci) { return true; @@ -142,9 +147,7 @@ class TestCommand extends Command with ArgUtils { case TestTypesRequested.integration: return runIntegrationTests(); case TestTypesRequested.all: - // TODO(nurhan): https://github.com/flutter/flutter/issues/53322 - // TODO(nurhan): Expand browser matrix for felt integration tests. - if (runAllTests && (isChrome || isSafariOnMacOS || isFirefox)) { + if (runAllTests && isIntegrationTestsAvailable) { bool unitTestResult = await runUnitTests(); bool integrationTestResult = await runIntegrationTests(); if (integrationTestResult != unitTestResult) { @@ -240,12 +243,35 @@ class TestCommand extends Command with ArgUtils { } if (htmlTargets.isNotEmpty) { - await _buildTests(targets: htmlTargets, forCanvasKit: false); + await _buildTestsInParallel(targets: htmlTargets, forCanvasKit: false); } + // Currently iOS Safari tests are running on simulator, which does not + // support canvaskit backend. if (canvasKitTargets.isNotEmpty) { - await _buildTests(targets: canvasKitTargets, forCanvasKit: true); + await _buildTestsInParallel( + targets: canvasKitTargets, forCanvasKit: true); } + + // Copy image files from test/ to build/test/. + // A side effect is this file copies all the images even when only one + // target test is asked to run. + final List contents = + environment.webUiTestDir.listSync(recursive: true); + contents.whereType().forEach((final io.File entity) { + final String directoryPath = path.relative(path.dirname(entity.path), + from: environment.webUiRootDir.path); + final io.Directory directory = io.Directory( + path.join(environment.webUiBuildDir.path, directoryPath)); + if (!directory.existsSync()) { + directory.createSync(recursive: true); + } + final String pathRelativeToWebUi = path.relative(entity.absolute.path, + from: environment.webUiRootDir.path); + entity.copySync( + path.join(environment.webUiBuildDir.path, pathRelativeToWebUi)); + }); + stopwatch.stop(); print('The build took ${stopwatch.elapsedMilliseconds ~/ 1000} seconds.'); } @@ -279,8 +305,40 @@ class TestCommand extends Command with ArgUtils { bool get isFirefox => browser == 'firefox'; /// Whether [browser] is set to "safari". - bool get isSafariOnMacOS => browser == 'safari' - && io.Platform.isMacOS; + bool get isSafariOnMacOS => browser == 'safari' && io.Platform.isMacOS; + + /// Due to lack of resources Chrome integration tests only run on Linux on + /// LUCI. + /// + /// They run on all platforms for local. + bool get isChromeIntegrationTestAvailable => + (isChrome && isLuci && io.Platform.isLinux) || (isChrome && !isLuci); + + /// Due to efficiancy constraints, Firefox integration tests only run on + /// Linux on LUCI. + /// + /// For now Firefox integration tests only run on Linux and Mac on local. + /// + // TODO: https://github.com/flutter/flutter/issues/63832 + bool get isFirefoxIntegrationTestAvailable => + (isFirefox && isLuci && io.Platform.isLinux) || + (isFirefox && !isLuci && !io.Platform.isWindows); + + /// Latest versions of Safari Desktop are only available on macOS. + /// + /// Integration testing on LUCI is not supported at the moment. + // TODO: https://github.com/flutter/flutter/issues/63710 + bool get isSafariIntegrationTestAvailable => isSafariOnMacOS && !isLuci; + + /// Due to various factors integration tests might be missing on a given + /// platform and given environment. + /// See: [isChromeIntegrationTestAvailable] + /// See: [isSafariIntegrationTestAvailable] + /// See: [isFirefoxIntegrationTestAvailable] + bool get isIntegrationTestsAvailable => + isChromeIntegrationTestAvailable || + isFirefoxIntegrationTestAvailable || + isSafariIntegrationTestAvailable; /// Use system flutter instead of cloning the repository. /// @@ -308,8 +366,10 @@ class TestCommand extends Command with ArgUtils { 'test', )); - // Screenshot tests and smoke tests only run in Chrome. - if (isChrome) { + // Screenshot tests and smoke tests only run on: "Chrome locally" or + // "Chrome on a Linux bot". We can remove the Linux bot restriction after: + // TODO: https://github.com/flutter/flutter/issues/63710 + if ((isChrome && isLuci && io.Platform.isLinux) || (isChrome && !isLuci)) { // Separate screenshot tests from unit-tests. Screenshot tests must run // one at a time. Otherwise, they will end up screenshotting each other. // This is not an issue for unit-tests. @@ -448,69 +508,69 @@ class TestCommand extends Command with ArgUtils { timestampFile.writeAsStringSync(timestamp); } + Future _buildTestsInParallel( + {List targets, bool forCanvasKit = false}) async { + final List buildInputs = targets + .map((FilePath f) => TestBuildInput(f, forCanvasKit: forCanvasKit)) + .toList(); + + final results = _pool.forEach( + buildInputs, + _buildTest, + ); + await for (final bool isSuccess in results) { + if (!isSuccess) { + throw ToolException('Failed to compile tests.'); + } + } + } + /// Builds the specific test [targets]. /// /// [targets] must not be null. /// - /// When building for CanvasKit we have to use a separate `build.canvaskit.yaml` - /// config file. Otherwise, `build.html.yaml` is used. Because `build_runner` - /// overwrites the output directories, we redirect the CanvasKit output to a - /// separate directory, then copy the files back to `build/test`. - Future _buildTests({List targets, bool forCanvasKit}) async { - print( - 'Building ${targets.length} targets for ${forCanvasKit ? 'CanvasKit' : 'HTML'}'); - final String canvasKitOutputRelativePath = - path.join('.dart_tool', 'canvaskit_tests'); + /// Uses `dart2js` for building the test. + /// + /// When building for CanvasKit we have to use extra argument + /// `DFLUTTER_WEB_USE_SKIA=true`. + Future _buildTest(TestBuildInput input) async { + final targetFileName = + '${input.path.relativeToWebUi}.browser_test.dart.js'; + final String targetPath = path.join('build', targetFileName); + + final io.Directory directoryToTarget = io.Directory(path.join( + environment.webUiBuildDir.path, + path.dirname(input.path.relativeToWebUi))); + + if (!directoryToTarget.existsSync()) { + directoryToTarget.createSync(recursive: true); + } + List arguments = [ - 'run', - 'build_runner', - 'build', + '--no-minify', + '--disable-inlining', + '--enable-asserts', '--enable-experiment=non-nullable', - 'test', + '--no-sound-null-safety', + if (input.forCanvasKit) '-DFLUTTER_WEB_USE_SKIA=true', + '-O2', '-o', - forCanvasKit ? canvasKitOutputRelativePath : 'build', - '--config', - // CanvasKit uses `build.canvaskit.yaml`, which HTML Uses `build.html.yaml`. - forCanvasKit ? 'canvaskit' : 'html', - for (FilePath path in targets) ...[ - '--build-filter=${path.relativeToWebUi}.js', - '--build-filter=${path.relativeToWebUi}.browser_test.dart.js', - ], + targetPath, // target path. + '${input.path.relativeToWebUi}', // current path. ]; final int exitCode = await runProcess( - environment.pubExecutable, + environment.dart2jsExecutable, arguments, workingDirectory: environment.webUiRootDir.path, - environment: { - // This determines the number of concurrent dart2js processes. - // - // By default build_runner uses 4 workers. - // - // In a testing on a 32-core 132GB workstation increasing this number to - // 32 sped up the build from ~4min to ~1.5min. - if (io.Platform.environment.containsKey('BUILD_MAX_WORKERS_PER_TASK')) - 'BUILD_MAX_WORKERS_PER_TASK': - io.Platform.environment['BUILD_MAX_WORKERS_PER_TASK'], - }, ); if (exitCode != 0) { - throw ToolException( - 'Failed to compile tests. Compiler exited with exit code $exitCode'); - } - - if (forCanvasKit) { - final io.Directory canvasKitTemporaryOutputDirectory = io.Directory( - path.join(environment.webUiRootDir.path, canvasKitOutputRelativePath, - 'test', 'canvaskit')); - final io.Directory canvasKitOutputDirectory = io.Directory( - path.join(environment.webUiBuildDir.path, 'test', 'canvaskit')); - if (await canvasKitOutputDirectory.exists()) { - await canvasKitOutputDirectory.delete(recursive: true); - } - await canvasKitTemporaryOutputDirectory - .rename(canvasKitOutputDirectory.path); + io.stderr.writeln('ERROR: Failed to compile test ${input.path}. ' + 'Dart2js exited with exit code $exitCode'); + return false; + } else { + return true; } } @@ -582,3 +642,16 @@ void _copyTestFontsIntoWebUi() { sourceTtf.copySync(destinationTtfPath); } } + +/// Used as an input message to the PoolResources that are building a test. +class TestBuildInput { + /// Test to build. + final FilePath path; + + /// Whether these tests should be build for CanvasKit. + /// + /// `-DFLUTTER_WEB_USE_SKIA=true` is passed to dart2js for CanvasKit. + final bool forCanvasKit; + + TestBuildInput(this.path, {this.forCanvasKit = false}); +} diff --git a/lib/web_ui/pubspec.yaml b/lib/web_ui/pubspec.yaml index 34a4ee540ec85..6defcc3037efe 100644 --- a/lib/web_ui/pubspec.yaml +++ b/lib/web_ui/pubspec.yaml @@ -9,6 +9,7 @@ dependencies: dev_dependencies: analyzer: 0.39.15 + archive: 2.0.13 http: 0.12.1 image: 2.1.13 js: 0.6.1+1 diff --git a/lib/web_ui/test/alarm_clock_test.dart b/lib/web_ui/test/alarm_clock_test.dart index 3a90f955b4db5..b56d0dc27d798 100644 --- a/lib/web_ui/test/alarm_clock_test.dart +++ b/lib/web_ui/test/alarm_clock_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:quiver/testing/async.dart'; import 'package:quiver/time.dart'; @@ -10,6 +11,10 @@ import 'package:quiver/time.dart'; import 'package:ui/src/engine.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group(AlarmClock, () { _alarmClockTests(); }); diff --git a/lib/web_ui/test/canvas_test.dart b/lib/web_ui/test/canvas_test.dart index 609f848695218..53635e0e3ccee 100644 --- a/lib/web_ui/test/canvas_test.dart +++ b/lib/web_ui/test/canvas_test.dart @@ -6,11 +6,16 @@ import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'mock_engine_canvas.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUpAll(() { WebExperiments.ensureInitialized(); }); diff --git a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart index 23da3c3d28f56..9847ca29a1dd0 100644 --- a/lib/web_ui/test/canvaskit/canvaskit_api_test.dart +++ b/lib/web_ui/test/canvaskit/canvaskit_api_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -14,6 +15,10 @@ import 'common.dart'; import 'test_data.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('CanvasKit API', () { setUpAll(() async { await ui.webOnlyInitializePlatform(); diff --git a/lib/web_ui/test/canvaskit/image_test.dart b/lib/web_ui/test/canvaskit/image_test.dart index 8ba442c7d495d..d8e3995da43d3 100644 --- a/lib/web_ui/test/canvaskit/image_test.dart +++ b/lib/web_ui/test/canvaskit/image_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; @@ -11,6 +12,10 @@ import 'common.dart'; import 'test_data.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('CanvasKit image', () { setUpAll(() async { await ui.webOnlyInitializePlatform(); diff --git a/lib/web_ui/test/canvaskit/path_metrics_test.dart b/lib/web_ui/test/canvaskit/path_metrics_test.dart index 62bde94a8678b..eece12c15b572 100644 --- a/lib/web_ui/test/canvaskit/path_metrics_test.dart +++ b/lib/web_ui/test/canvaskit/path_metrics_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -11,6 +12,10 @@ import 'package:ui/ui.dart' as ui; import 'common.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Path Metrics', () { setUpAll(() async { await ui.webOnlyInitializePlatform(); diff --git a/lib/web_ui/test/canvaskit/shader_test.dart b/lib/web_ui/test/canvaskit/shader_test.dart index 8e4ec00a98b1f..dfa3f2dd12b04 100644 --- a/lib/web_ui/test/canvaskit/shader_test.dart +++ b/lib/web_ui/test/canvaskit/shader_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; @@ -13,6 +14,10 @@ import 'common.dart'; import 'test_data.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('CanvasKit shaders', () { setUpAll(() async { await ui.webOnlyInitializePlatform(); diff --git a/lib/web_ui/test/canvaskit/skia_objects_cache_test.dart b/lib/web_ui/test/canvaskit/skia_objects_cache_test.dart index 4b66374a9c114..08e0cb3d55837 100644 --- a/lib/web_ui/test/canvaskit/skia_objects_cache_test.dart +++ b/lib/web_ui/test/canvaskit/skia_objects_cache_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'package:mockito/mockito.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; @@ -13,6 +14,10 @@ import 'package:ui/src/engine.dart'; import 'common.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('skia_objects_cache', () { _tests(); // TODO: https://github.com/flutter/flutter/issues/60040 diff --git a/lib/web_ui/test/canvaskit/vertices_test.dart b/lib/web_ui/test/canvaskit/vertices_test.dart index a223245337061..0f0263a04eb7b 100644 --- a/lib/web_ui/test/canvaskit/vertices_test.dart +++ b/lib/web_ui/test/canvaskit/vertices_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; @@ -10,6 +11,10 @@ import 'package:ui/ui.dart' as ui; import 'common.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Vertices', () { setUpAll(() async { await ui.webOnlyInitializePlatform(); diff --git a/lib/web_ui/test/clipboard_test.dart b/lib/web_ui/test/clipboard_test.dart index eb67e5beff575..e0c526176e831 100644 --- a/lib/web_ui/test/clipboard_test.dart +++ b/lib/web_ui/test/clipboard_test.dart @@ -7,11 +7,16 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:mockito/mockito.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; import 'package:ui/src/engine.dart'; -Future main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { await ui.webOnlyInitializeTestDomRenderer(); group('message handler', () { const String testText = 'test text'; diff --git a/lib/web_ui/test/color_test.dart b/lib/web_ui/test/color_test.dart index 8d53b77f73659..d48ea0bef83cb 100644 --- a/lib/web_ui/test/color_test.dart +++ b/lib/web_ui/test/color_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'package:ui/ui.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +void main() { + internalBootstrapBrowserTest(() => testMain); +} + class NotAColor extends Color { const NotAColor(int value) : super(value); } -void main() { +void testMain() { test('color accessors should work', () { const Color foo = Color(0x12345678); expect(foo.alpha, equals(0x12)); diff --git a/lib/web_ui/test/dom_renderer_test.dart b/lib/web_ui/test/dom_renderer_test.dart index ca9d6804a47c8..514c54d4160bc 100644 --- a/lib/web_ui/test/dom_renderer_test.dart +++ b/lib/web_ui/test/dom_renderer_test.dart @@ -5,10 +5,15 @@ // @dart = 2.6 import 'dart:html' as html; -import 'package:ui/src/engine.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/src/engine.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('creating elements works', () { final DomRenderer renderer = DomRenderer(); final html.Element element = renderer.createElement('div'); diff --git a/lib/web_ui/test/engine/frame_reference_test.dart b/lib/web_ui/test/engine/frame_reference_test.dart index 6ccd91c57b207..0658f8258ba7c 100644 --- a/lib/web_ui/test/engine/frame_reference_test.dart +++ b/lib/web_ui/test/engine/frame_reference_test.dart @@ -4,9 +4,14 @@ // @dart = 2.6 import 'package:ui/src/engine.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('CrossFrameCache', () { test('Reuse returns no object when cache empty', () { final CrossFrameCache cache = CrossFrameCache(); diff --git a/lib/web_ui/test/engine/history_test.dart b/lib/web_ui/test/engine/history_test.dart index 58d536aff4785..4d621117a633c 100644 --- a/lib/web_ui/test/engine/history_test.dart +++ b/lib/web_ui/test/engine/history_test.dart @@ -10,6 +10,7 @@ import 'dart:async'; import 'dart:html' as html; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -29,6 +30,10 @@ const MethodCodec codec = JSONMethodCodec(); void emptyCallback(ByteData date) {} void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('$BrowserHistory', () { final PlatformMessagesSpy spy = PlatformMessagesSpy(); diff --git a/lib/web_ui/test/engine/image/html_image_codec_test.dart b/lib/web_ui/test/engine/image/html_image_codec_test.dart index 853e102f82e23..d29df24ff44f7 100644 --- a/lib/web_ui/test/engine/image/html_image_codec_test.dart +++ b/lib/web_ui/test/engine/image/html_image_codec_test.dart @@ -3,11 +3,16 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; import 'package:ui/src/engine.dart'; -Future main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { await ui.webOnlyInitializeTestDomRenderer(); group('HtmCodec', () { test('loads sample image', () async { diff --git a/lib/web_ui/test/engine/navigation_test.dart b/lib/web_ui/test/engine/navigation_test.dart index 8266fd7ec9904..d4ac941d3de59 100644 --- a/lib/web_ui/test/engine/navigation_test.dart +++ b/lib/web_ui/test/engine/navigation_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart' as engine; @@ -15,6 +16,10 @@ const engine.MethodCodec codec = engine.JSONMethodCodec(); void emptyCallback(ByteData date) {} void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUp(() { engine.window.locationStrategy = _strategy = engine.TestLocationStrategy(); }); diff --git a/lib/web_ui/test/engine/path_metrics_test.dart b/lib/web_ui/test/engine/path_metrics_test.dart index f4181f3917a49..a8938f913d99f 100644 --- a/lib/web_ui/test/engine/path_metrics_test.dart +++ b/lib/web_ui/test/engine/path_metrics_test.dart @@ -4,14 +4,19 @@ import 'dart:math' as math; -import 'package:ui/ui.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/ui.dart'; import '../matchers.dart'; const double kTolerance = 0.001; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('PathMetric length', () { test('empty path', () { Path path = Path(); diff --git a/lib/web_ui/test/engine/pointer_binding_test.dart b/lib/web_ui/test/engine/pointer_binding_test.dart index 5f6ac793c38ff..091cde33fc52f 100644 --- a/lib/web_ui/test/engine/pointer_binding_test.dart +++ b/lib/web_ui/test/engine/pointer_binding_test.dart @@ -6,11 +6,11 @@ import 'dart:html' as html; import 'dart:js_util' as js_util; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; -import 'package:test/test.dart'; - const int _kNoButtonChange = -1; const PointerSupportDetector _defaultSupportDetector = PointerSupportDetector(); @@ -40,6 +40,10 @@ bool get isIosSafari => (browserEngine == BrowserEngine.webkit && operatingSystem == OperatingSystem.iOs); void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { html.Element glassPane = domRenderer.glassPaneElement; setUp(() { diff --git a/lib/web_ui/test/engine/profiler_test.dart b/lib/web_ui/test/engine/profiler_test.dart index 0314ee9c8ef6a..49f11242c860d 100644 --- a/lib/web_ui/test/engine/profiler_test.dart +++ b/lib/web_ui/test/engine/profiler_test.dart @@ -6,11 +6,16 @@ import 'dart:html' as html; import 'dart:js_util' as js_util; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUp(() { Profiler.isBenchmarkMode = true; Profiler.ensureInitialized(); diff --git a/lib/web_ui/test/engine/recording_canvas_test.dart b/lib/web_ui/test/engine/recording_canvas_test.dart index d997f811b862c..7bd1a9810eef4 100644 --- a/lib/web_ui/test/engine/recording_canvas_test.dart +++ b/lib/web_ui/test/engine/recording_canvas_test.dart @@ -3,13 +3,18 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import '../mock_engine_canvas.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { RecordingCanvas underTest; MockEngineCanvas mockCanvas; final Rect screenRect = Rect.largest; diff --git a/lib/web_ui/test/engine/semantics/accessibility_test.dart b/lib/web_ui/test/engine/semantics/accessibility_test.dart index 767d4742ad0ea..6eb3366668752 100644 --- a/lib/web_ui/test/engine/semantics/accessibility_test.dart +++ b/lib/web_ui/test/engine/semantics/accessibility_test.dart @@ -6,8 +6,9 @@ import 'dart:async' show Future; import 'dart:html'; -import 'package:ui/src/engine.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/src/engine.dart'; const MessageCodec codec = StandardMessageCodec(); const String testMessage = 'This is an tooltip.'; @@ -16,6 +17,10 @@ const Map testInput = { }; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { AccessibilityAnnouncements accessibilityAnnouncements; group('$AccessibilityAnnouncements', () { diff --git a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart index cd3e0e9e561d9..56fb691d117a1 100644 --- a/lib/web_ui/test/engine/semantics/semantics_helper_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_helper_test.dart @@ -5,11 +5,15 @@ // @dart = 2.6 import 'dart:html' as html; -import 'package:ui/src/engine.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/src/engine.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('$DesktopSemanticsEnabler', () { DesktopSemanticsEnabler desktopSemanticsEnabler; html.Element _placeholder; diff --git a/lib/web_ui/test/engine/semantics/semantics_test.dart b/lib/web_ui/test/engine/semantics/semantics_test.dart index 016c94f0c5f7c..d3b0e52eb0180 100644 --- a/lib/web_ui/test/engine/semantics/semantics_test.dart +++ b/lib/web_ui/test/engine/semantics/semantics_test.dart @@ -12,6 +12,7 @@ import 'dart:typed_data'; import 'package:mockito/mockito.dart'; import 'package:quiver/testing/async.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -24,6 +25,10 @@ DateTime _testTime = DateTime(2018, 12, 17); EngineSemanticsOwner semantics() => EngineSemanticsOwner.instance; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUp(() { EngineSemanticsOwner.debugResetSemantics(); }); diff --git a/lib/web_ui/test/engine/services/serialization_test.dart b/lib/web_ui/test/engine/services/serialization_test.dart index f0f0b58fd4900..e7eb72b7f73c9 100644 --- a/lib/web_ui/test/engine/services/serialization_test.dart +++ b/lib/web_ui/test/engine/services/serialization_test.dart @@ -5,11 +5,16 @@ // @dart = 2.6 import 'dart:typed_data'; +import 'package:test/test.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Write and read buffer round-trip', () { test('of single byte', () { final WriteBuffer write = WriteBuffer(); diff --git a/lib/web_ui/test/engine/surface/path/path_iterator_test.dart b/lib/web_ui/test/engine/surface/path/path_iterator_test.dart index 28c3f261fcefa..3e4c21e029930 100644 --- a/lib/web_ui/test/engine/surface/path/path_iterator_test.dart +++ b/lib/web_ui/test/engine/surface/path/path_iterator_test.dart @@ -5,9 +5,14 @@ import 'dart:typed_data'; import 'package:ui/src/engine.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { final Float32List points = Float32List(PathIterator.kMaxBufferSize); group('PathIterator', () { diff --git a/lib/web_ui/test/engine/surface/path/path_winding_test.dart b/lib/web_ui/test/engine/surface/path/path_winding_test.dart index 905fc6c8f153f..32133e648285b 100644 --- a/lib/web_ui/test/engine/surface/path/path_winding_test.dart +++ b/lib/web_ui/test/engine/surface/path/path_winding_test.dart @@ -5,12 +5,17 @@ // @dart = 2.10 import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' hide window; import 'package:ui/src/engine.dart'; -/// Test winding and convexity of a path. void main() { + internalBootstrapBrowserTest(() => testMain); +} + +/// Test winding and convexity of a path. +void testMain() { group('Convexity', () { test('Empty path should be convex', () { final SurfacePath path = SurfacePath(); diff --git a/lib/web_ui/test/engine/surface/scene_builder_test.dart b/lib/web_ui/test/engine/surface/scene_builder_test.dart index f01864fde9f0a..e57a41a99cc97 100644 --- a/lib/web_ui/test/engine/surface/scene_builder_test.dart +++ b/lib/web_ui/test/engine/surface/scene_builder_test.dart @@ -8,14 +8,21 @@ import 'dart:async'; import 'dart:html' as html; import 'dart:js_util' as js_util; + +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' hide window; -import 'package:test/test.dart'; + import '../../matchers.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUpAll(() async { await webOnlyInitializeEngine(); }); diff --git a/lib/web_ui/test/engine/surface/surface_test.dart b/lib/web_ui/test/engine/surface/surface_test.dart index 9da82f026821e..d7dbe9c827afd 100644 --- a/lib/web_ui/test/engine/surface/surface_test.dart +++ b/lib/web_ui/test/engine/surface/surface_test.dart @@ -8,9 +8,14 @@ import 'dart:html' as html; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Surface', () { setUp(() { SurfaceSceneBuilder.debugForgetFrameScene(); diff --git a/lib/web_ui/test/engine/ulps_test.dart b/lib/web_ui/test/engine/ulps_test.dart index 9d993e92eb262..d0a26c45faad7 100644 --- a/lib/web_ui/test/engine/ulps_test.dart +++ b/lib/web_ui/test/engine/ulps_test.dart @@ -3,10 +3,15 @@ // found in the LICENSE file. import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Float Int conversions', (){ test('Should convert signbit to 2\'s compliment', () { expect(signBitTo2sCompliment(0), 0); diff --git a/lib/web_ui/test/engine/util_test.dart b/lib/web_ui/test/engine/util_test.dart index 51d58c2b11810..9ff47eb2b3e14 100644 --- a/lib/web_ui/test/engine/util_test.dart +++ b/lib/web_ui/test/engine/util_test.dart @@ -5,9 +5,9 @@ // @dart = 2.6 import 'dart:typed_data'; -import 'package:ui/src/engine.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/src/engine.dart'; final Float32List identityTransform = Matrix4.identity().storage; final Float32List xTranslation = (Matrix4.identity()..translate(10)).storage; @@ -17,6 +17,10 @@ final Float32List scaleAndTranslate2d = (Matrix4.identity()..scale(2, 3, 1)..tra final Float32List rotation2d = (Matrix4.identity()..rotateZ(0.2)).storage; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('transformKindOf and isIdentityFloat32ListTransform identify matrix kind', () { expect(transformKindOf(identityTransform), TransformKind.identity); expect(isIdentityFloat32ListTransform(identityTransform), isTrue); diff --git a/lib/web_ui/test/engine/web_experiments_test.dart b/lib/web_ui/test/engine/web_experiments_test.dart index 7f06f9639641b..c0f0a4f7f05f2 100644 --- a/lib/web_ui/test/engine/web_experiments_test.dart +++ b/lib/web_ui/test/engine/web_experiments_test.dart @@ -6,12 +6,17 @@ import 'dart:html' as html; import 'dart:js_util' as js_util; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; const bool _defaultUseCanvasText = true; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUp(() { WebExperiments.ensureInitialized(); }); diff --git a/lib/web_ui/test/engine/window_test.dart b/lib/web_ui/test/engine/window_test.dart index d73fcfdf94e94..ae97dceb8678b 100644 --- a/lib/web_ui/test/engine/window_test.dart +++ b/lib/web_ui/test/engine/window_test.dart @@ -7,11 +7,16 @@ import 'dart:async'; import 'dart:html' as html; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; import 'package:ui/src/engine.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('onTextScaleFactorChanged preserves the zone', () { final Zone innerZone = Zone.current.fork(); diff --git a/lib/web_ui/test/geometry_test.dart b/lib/web_ui/test/geometry_test.dart index ba2272a3a387c..07ad7601d8d5d 100644 --- a/lib/web_ui/test/geometry_test.dart +++ b/lib/web_ui/test/geometry_test.dart @@ -6,11 +6,16 @@ import 'dart:math' as math show sqrt; import 'dart:math' show pi; -import 'package:ui/ui.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/ui.dart'; + void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('Offset.direction', () { expect(const Offset(0.0, 0.0).direction, 0.0); expect(const Offset(0.0, 1.0).direction, pi / 2.0); diff --git a/lib/web_ui/test/golden_tests/engine/backdrop_filter_golden_test.dart b/lib/web_ui/test/golden_tests/engine/backdrop_filter_golden_test.dart index 5b0cc417e1397..797b1cf6b34d1 100644 --- a/lib/web_ui/test/golden_tests/engine/backdrop_filter_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/backdrop_filter_golden_test.dart @@ -5,15 +5,20 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; final Rect region = Rect.fromLTWH(0, 0, 500, 500); -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { setUp(() async { debugShowClipLayers = true; SurfaceSceneBuilder.debugForgetFrameScene(); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_arc_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_arc_golden_test.dart index 88e85ab9c95da..888a3f4f1e27a 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_arc_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_arc_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 400, 600); BitmapCanvas canvas; @@ -107,4 +112,4 @@ void paintArc(BitmapCanvas canvas, Offset offset, ..strokeWidth = 2 ..color = Color(0x61000000) // black38 ..style = PaintingStyle.stroke); -} \ No newline at end of file +} diff --git a/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart index 8407e48766b33..39cfcb4b27feb 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_blend_golden_test.dart @@ -6,13 +6,17 @@ import 'dart:html' as html; import 'dart:js_util' as js_util; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; +void main() { + internalBootstrapBrowserTest(() => testMain); +} -void main() async { +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart index d01620921c1d7..1436e934a59fa 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_clip_path_test.dart @@ -6,13 +6,18 @@ import 'dart:html' as html; import 'dart:js_util' as js_util; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart' as engine; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_context_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_context_test.dart index 927bf2a300fbd..226b8c8a61095 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_context_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_context_test.dart @@ -5,14 +5,19 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart' as engine; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; +void main() { + internalBootstrapBrowserTest(() => testMain); +} + /// Tests context save/restore. -void main() async { +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart index 8a08c22a21aef..16efb34e3fe78 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_draw_image_golden_test.dart @@ -7,15 +7,20 @@ import 'dart:html' as html; import 'dart:math' as math; import 'dart:js_util' as js_util; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; import 'scuba.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_draw_picture_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_draw_picture_test.dart index de4c52cebb1d2..b70666711f5ba 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_draw_picture_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_draw_picture_test.dart @@ -5,15 +5,20 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; final Rect region = Rect.fromLTWH(0, 0, 500, 100); -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { setUp(() async { debugShowClipLayers = true; SurfaceSceneBuilder.debugForgetFrameScene(); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_draw_points_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_draw_points_test.dart index 8688140b290f2..c3e6adaa0469c 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_draw_points_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_draw_points_test.dart @@ -6,14 +6,18 @@ import 'dart:html' as html; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; - import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 400, 600); BitmapCanvas canvas; diff --git a/lib/web_ui/test/golden_tests/engine/canvas_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_golden_test.dart index ce55498eba86a..a072d025974fd 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_golden_test.dart @@ -6,15 +6,20 @@ import 'dart:html' as html; import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; import 'scuba.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 500, 100); BitmapCanvas canvas; diff --git a/lib/web_ui/test/golden_tests/engine/canvas_image_blend_mode_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_image_blend_mode_test.dart index ca30387f99319..962d930d8884f 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_image_blend_mode_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_image_blend_mode_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_lines_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_lines_golden_test.dart index 215d51da5c29e..8447c26806d47 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_lines_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_lines_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 300, 300); BitmapCanvas canvas; diff --git a/lib/web_ui/test/golden_tests/engine/canvas_mask_filter_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_mask_filter_test.dart index a808a57a28598..1f3184c67a097 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_mask_filter_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_mask_filter_test.dart @@ -7,13 +7,18 @@ import 'dart:html' as html; import 'dart:math' as math; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { // Commit a recording canvas to a bitmap, and compare with the expected Future _checkScreenshot(RecordingCanvas rc, String fileName, ui.Rect screenRect, {bool write = false}) async { final EngineCanvas engineCanvas = BitmapCanvas(screenRect); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_rect_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_rect_golden_test.dart index ea77b27ccd802..07d19e51dc902 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_rect_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_rect_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 150, 420); BitmapCanvas canvas; diff --git a/lib/web_ui/test/golden_tests/engine/canvas_reuse_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_reuse_test.dart index 469cc2f88faf8..2bd62f258fa20 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_reuse_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_reuse_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart index 95d977993704c..1506419d20e74 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_rrect_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(8, 8, 500, 100); // Compensate for old scuba tester padding BitmapCanvas canvas; diff --git a/lib/web_ui/test/golden_tests/engine/canvas_stroke_joins_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_stroke_joins_golden_test.dart index 0a85cc25f96aa..8ae75205bfb47 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_stroke_joins_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_stroke_joins_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 300, 300); BitmapCanvas canvas; @@ -68,4 +73,4 @@ void paintStrokeJoins(BitmapCanvas canvas) { end = end.translate(0, 20); } } -} \ No newline at end of file +} diff --git a/lib/web_ui/test/golden_tests/engine/canvas_stroke_rects_golden_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_stroke_rects_golden_test.dart index 447f9706030ec..4a81d2fe52665 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_stroke_rects_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_stroke_rects_golden_test.dart @@ -6,13 +6,18 @@ import 'dart:html' as html; import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 300, 300); BitmapCanvas canvas; @@ -63,4 +68,4 @@ void paintSideBySideRects(BitmapCanvas canvas) { ..style = PaintingStyle.stroke ..strokeWidth = 4 ..color = Color(0x7fffff00)); -} \ No newline at end of file +} diff --git a/lib/web_ui/test/golden_tests/engine/canvas_winding_rule_test.dart b/lib/web_ui/test/golden_tests/engine/canvas_winding_rule_test.dart index 556705953bc23..e48001071a301 100644 --- a/lib/web_ui/test/golden_tests/engine/canvas_winding_rule_test.dart +++ b/lib/web_ui/test/golden_tests/engine/canvas_winding_rule_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 500, 500); BitmapCanvas canvas; diff --git a/lib/web_ui/test/golden_tests/engine/compositing_golden_test.dart b/lib/web_ui/test/golden_tests/engine/compositing_golden_test.dart index 5a8616f02a803..04dce71d0b986 100644 --- a/lib/web_ui/test/golden_tests/engine/compositing_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/compositing_golden_test.dart @@ -6,16 +6,21 @@ import 'dart:html' as html; import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import '../../matchers.dart'; import 'package:web_engine_tester/golden_tester.dart'; final Rect region = Rect.fromLTWH(0, 0, 500, 100); -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { setUp(() async { debugShowClipLayers = true; SurfaceSceneBuilder.debugForgetFrameScene(); diff --git a/lib/web_ui/test/golden_tests/engine/conic_golden_test.dart b/lib/web_ui/test/golden_tests/engine/conic_golden_test.dart index bcf69c155e212..9362cccebd3b9 100644 --- a/lib/web_ui/test/golden_tests/engine/conic_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/conic_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(8, 8, 600, 800); // Compensate for old scuba tester padding Future testPath(Path path, String scubaFileName) async { diff --git a/lib/web_ui/test/golden_tests/engine/draw_vertices_golden_test.dart b/lib/web_ui/test/golden_tests/engine/draw_vertices_golden_test.dart index 765c614ae4cfc..68a2136343791 100644 --- a/lib/web_ui/test/golden_tests/engine/draw_vertices_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/draw_vertices_golden_test.dart @@ -6,13 +6,18 @@ import 'dart:html' as html; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/linear_gradient_golden_test.dart b/lib/web_ui/test/golden_tests/engine/linear_gradient_golden_test.dart index cbeadad84a958..6eccec76d3234 100644 --- a/lib/web_ui/test/golden_tests/engine/linear_gradient_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/linear_gradient_golden_test.dart @@ -6,13 +6,18 @@ import 'dart:html' as html; import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/multiline_text_clipping_golden_test.dart b/lib/web_ui/test/golden_tests/engine/multiline_text_clipping_golden_test.dart index cd3378b569896..fd9efc8bfb44d 100644 --- a/lib/web_ui/test/golden_tests/engine/multiline_text_clipping_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/multiline_text_clipping_golden_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; @@ -12,7 +13,11 @@ import 'scuba.dart'; typedef PaintTest = void Function(RecordingCanvas recordingCanvas); -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { // Scuba doesn't give us viewport smaller than 472px wide. final EngineScubaTester scuba = await EngineScubaTester.initialize( viewportSize: const Size(600, 600), diff --git a/lib/web_ui/test/golden_tests/engine/path_metrics_test.dart b/lib/web_ui/test/golden_tests/engine/path_metrics_test.dart index 8695296ab9dbd..380036ba18dde 100644 --- a/lib/web_ui/test/golden_tests/engine/path_metrics_test.dart +++ b/lib/web_ui/test/golden_tests/engine/path_metrics_test.dart @@ -5,14 +5,19 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import '../../matchers.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/path_to_svg_golden_test.dart b/lib/web_ui/test/golden_tests/engine/path_to_svg_golden_test.dart index f657f36a5ae02..03d9f0c1ad2e7 100644 --- a/lib/web_ui/test/golden_tests/engine/path_to_svg_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/path_to_svg_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(8, 8, 600, 800); // Compensate for old scuba tester padding Future testPath(Path path, String scubaFileName, {Paint paint, double maxDiffRatePercent = null}) async { diff --git a/lib/web_ui/test/golden_tests/engine/path_transform_test.dart b/lib/web_ui/test/golden_tests/engine/path_transform_test.dart index 789f0259eeee6..0f968ba72b056 100644 --- a/lib/web_ui/test/golden_tests/engine/path_transform_test.dart +++ b/lib/web_ui/test/golden_tests/engine/path_transform_test.dart @@ -6,13 +6,18 @@ import 'dart:html' as html; import 'dart:math' as math; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/picture_golden_test.dart b/lib/web_ui/test/golden_tests/engine/picture_golden_test.dart index af959cd4fe6c8..1c61fff196a09 100644 --- a/lib/web_ui/test/golden_tests/engine/picture_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/picture_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Picture', () { test('toImage produces an image', () async { final EnginePictureRecorder recorder = ui.PictureRecorder(); diff --git a/lib/web_ui/test/golden_tests/engine/radial_gradient_golden_test.dart b/lib/web_ui/test/golden_tests/engine/radial_gradient_golden_test.dart index 4fb58ebc3df94..098233fe1cfb3 100644 --- a/lib/web_ui/test/golden_tests/engine/radial_gradient_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/radial_gradient_golden_test.dart @@ -5,13 +5,18 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/recording_canvas_golden_test.dart b/lib/web_ui/test/golden_tests/engine/recording_canvas_golden_test.dart index 618c7e9ac973e..4d69f8955ad6a 100644 --- a/lib/web_ui/test/golden_tests/engine/recording_canvas_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/recording_canvas_golden_test.dart @@ -7,14 +7,19 @@ import 'dart:html' as html; import 'dart:math' as math; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/ui.dart' hide TextStyle; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; import '../../matchers.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double screenWidth = 600.0; const double screenHeight = 800.0; const Rect screenRect = Rect.fromLTWH(0, 0, screenWidth, screenHeight); diff --git a/lib/web_ui/test/golden_tests/engine/shadow_golden_test.dart b/lib/web_ui/test/golden_tests/engine/shadow_golden_test.dart index c6f98e4e5d91b..307cdb583caad 100644 --- a/lib/web_ui/test/golden_tests/engine/shadow_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/shadow_golden_test.dart @@ -5,9 +5,10 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; import 'package:web_engine_tester/golden_tester.dart'; @@ -15,7 +16,11 @@ import 'scuba.dart'; const Color _kShadowColor = Color.fromARGB(255, 0, 0, 0); -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final Rect region = Rect.fromLTWH(0, 0, 550, 300); SurfaceSceneBuilder builder; diff --git a/lib/web_ui/test/golden_tests/engine/text_overflow_golden_test.dart b/lib/web_ui/test/golden_tests/engine/text_overflow_golden_test.dart index 507be4fd33df9..dc243b2ab711d 100644 --- a/lib/web_ui/test/golden_tests/engine/text_overflow_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/text_overflow_golden_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'dart:async'; +import 'package:test/bootstrap/browser.dart'; import 'package:ui/ui.dart' hide window; import 'package:ui/src/engine.dart'; @@ -21,7 +22,11 @@ const String veryLong = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.'; const String longUnbreakable = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final EngineScubaTester scuba = await EngineScubaTester.initialize( viewportSize: const Size(800, 800), ); diff --git a/lib/web_ui/test/golden_tests/engine/text_placeholders_test.dart b/lib/web_ui/test/golden_tests/engine/text_placeholders_test.dart index 9c1d6a50dc3ef..e89bc7ee69a7a 100644 --- a/lib/web_ui/test/golden_tests/engine/text_placeholders_test.dart +++ b/lib/web_ui/test/golden_tests/engine/text_placeholders_test.dart @@ -4,6 +4,7 @@ // @dart = 2.6 // import 'package:image/image.dart'; +import 'package:test/bootstrap/browser.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; @@ -11,7 +12,11 @@ import 'scuba.dart'; typedef PaintTest = void Function(RecordingCanvas recordingCanvas); -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final EngineScubaTester scuba = await EngineScubaTester.initialize( viewportSize: const Size(600, 600), ); diff --git a/lib/web_ui/test/golden_tests/engine/text_style_golden_test.dart b/lib/web_ui/test/golden_tests/engine/text_style_golden_test.dart index 9727dd596c38f..5f31ca6ada828 100644 --- a/lib/web_ui/test/golden_tests/engine/text_style_golden_test.dart +++ b/lib/web_ui/test/golden_tests/engine/text_style_golden_test.dart @@ -3,12 +3,17 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; import 'scuba.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { final EngineScubaTester scuba = await EngineScubaTester.initialize( viewportSize: const Size(800, 800), ); diff --git a/lib/web_ui/test/golden_tests/golden_failure_smoke_test.dart b/lib/web_ui/test/golden_tests/golden_failure_smoke_test.dart index 882bdb60e3f75..7a0cfc7c621e0 100644 --- a/lib/web_ui/test/golden_tests/golden_failure_smoke_test.dart +++ b/lib/web_ui/test/golden_tests/golden_failure_smoke_test.dart @@ -5,11 +5,16 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:web_engine_tester/golden_tester.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('screenshot test reports failure', () async { html.document.body.innerHtml = 'Text that does not appear on the screenshot!'; await matchGoldenFile('__local__/smoke_test.png', region: Rect.fromLTWH(0, 0, 320, 200)); diff --git a/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart b/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart index 97d505511a709..563e3e92c7269 100644 --- a/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart +++ b/lib/web_ui/test/golden_tests/golden_success_smoke_test.dart @@ -5,12 +5,17 @@ // @dart = 2.6 import 'dart:html' as html; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart'; import 'package:ui/src/engine.dart'; import 'package:web_engine_tester/golden_tester.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { debugEmulateFlutterTesterEnvironment = true; await webOnlyInitializePlatform(assetManager: WebOnlyMockAssetManager()); diff --git a/lib/web_ui/test/gradient_test.dart b/lib/web_ui/test/gradient_test.dart index a0df9ebdde051..b4335dd353228 100644 --- a/lib/web_ui/test/gradient_test.dart +++ b/lib/web_ui/test/gradient_test.dart @@ -3,11 +3,16 @@ // found in the LICENSE file. // @dart = 2.6 -import 'package:ui/ui.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/ui.dart'; + void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('Gradient.radial with no focal point', () { expect( Gradient.radial( diff --git a/lib/web_ui/test/hash_codes_test.dart b/lib/web_ui/test/hash_codes_test.dart index 7349dc7398edc..cca96671b711a 100644 --- a/lib/web_ui/test/hash_codes_test.dart +++ b/lib/web_ui/test/hash_codes_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart'; @@ -13,6 +14,10 @@ import 'package:ui/ui.dart'; const int _kBiggestExactJavaScriptInt = 9007199254740992; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('hashValues can hash lots of huge values effectively', () { expect( hashValues( diff --git a/lib/web_ui/test/keyboard_test.dart b/lib/web_ui/test/keyboard_test.dart index 3a819d6ffbf90..4b68cec6e2e13 100644 --- a/lib/web_ui/test/keyboard_test.dart +++ b/lib/web_ui/test/keyboard_test.dart @@ -8,12 +8,16 @@ import 'dart:js_util' as js_util; import 'dart:typed_data'; import 'package:quiver/testing/async.dart'; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; -import 'package:test/test.dart'; - void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Keyboard', () { /// Used to save and restore [ui.window.onPlatformMessage] after each test. ui.PlatformMessageCallback savedCallback; diff --git a/lib/web_ui/test/locale_test.dart b/lib/web_ui/test/locale_test.dart index eb9331b465e59..316a42ae1101f 100644 --- a/lib/web_ui/test/locale_test.dart +++ b/lib/web_ui/test/locale_test.dart @@ -3,11 +3,15 @@ // found in the LICENSE file. // @dart = 2.6 -import 'package:ui/ui.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/ui.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('Locale', () { const Null $null = null; expect(const Locale('en').toString(), 'en'); diff --git a/lib/web_ui/test/paragraph_builder_test.dart b/lib/web_ui/test/paragraph_builder_test.dart index 54a3bcf53b046..fe3041bc1539f 100644 --- a/lib/web_ui/test/paragraph_builder_test.dart +++ b/lib/web_ui/test/paragraph_builder_test.dart @@ -3,12 +3,16 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart'; -import 'package:test/test.dart'; - void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { setUpAll(() { WebExperiments.ensureInitialized(); }); diff --git a/lib/web_ui/test/paragraph_test.dart b/lib/web_ui/test/paragraph_test.dart index 7082a8fd0254e..df3f45edf2e6f 100644 --- a/lib/web_ui/test/paragraph_test.dart +++ b/lib/web_ui/test/paragraph_test.dart @@ -3,10 +3,11 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' hide window; -import 'package:test/test.dart'; void testEachMeasurement(String description, VoidCallback body, {bool skip}) { test('$description (dom measurement)', () async { @@ -31,7 +32,11 @@ void testEachMeasurement(String description, VoidCallback body, {bool skip}) { }, skip: skip); } -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { await webOnlyInitializeTestDomRenderer(); // Ahem font uses a constant ideographic/alphabetic baseline ratio. diff --git a/lib/web_ui/test/path_test.dart b/lib/web_ui/test/path_test.dart index 04461410cae5d..6f19c9cc8f439 100644 --- a/lib/web_ui/test/path_test.dart +++ b/lib/web_ui/test/path_test.dart @@ -7,6 +7,7 @@ import 'dart:js_util' as js_util; import 'dart:html' as html; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' hide window; import 'package:ui/src/engine.dart'; @@ -14,6 +15,10 @@ import 'package:ui/src/engine.dart'; import 'matchers.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('Path', () { test('Should have no subpaths when created', () { final SurfacePath path = SurfacePath(); diff --git a/lib/web_ui/test/rect_test.dart b/lib/web_ui/test/rect_test.dart index e5719e711603f..a526b4590e9dc 100644 --- a/lib/web_ui/test/rect_test.dart +++ b/lib/web_ui/test/rect_test.dart @@ -3,11 +3,15 @@ // found in the LICENSE file. // @dart = 2.6 -import 'package:ui/ui.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/ui.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('rect accessors', () { const Rect r = Rect.fromLTRB(1.0, 3.0, 5.0, 7.0); expect(r.left, equals(1.0)); diff --git a/lib/web_ui/test/rrect_test.dart b/lib/web_ui/test/rrect_test.dart index b9d1f59e07ae1..02943b8413adc 100644 --- a/lib/web_ui/test/rrect_test.dart +++ b/lib/web_ui/test/rrect_test.dart @@ -3,11 +3,15 @@ // found in the LICENSE file. // @dart = 2.6 -import 'package:ui/ui.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart' hide TypeMatcher, isInstanceOf; +import 'package:ui/ui.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('RRect.contains()', () { final RRect rrect = RRect.fromRectAndCorners( const Rect.fromLTRB(1.0, 1.0, 2.0, 2.0), diff --git a/lib/web_ui/test/text/font_collection_test.dart b/lib/web_ui/test/text/font_collection_test.dart index ec5590f008a23..b6423378ef6b0 100644 --- a/lib/web_ui/test/text/font_collection_test.dart +++ b/lib/web_ui/test/text/font_collection_test.dart @@ -5,11 +5,16 @@ // @dart = 2.6 import 'dart:html' as html; -import 'package:ui/src/engine.dart'; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/src/engine.dart'; + void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('$FontManager', () { FontManager fontManager; const String _testFontUrl = 'packages/ui/assets/ahem.ttf'; diff --git a/lib/web_ui/test/text/font_loading_test.dart b/lib/web_ui/test/text/font_loading_test.dart index 5b34d9d9346ae..81ff90eb568b8 100644 --- a/lib/web_ui/test/text/font_loading_test.dart +++ b/lib/web_ui/test/text/font_loading_test.dart @@ -8,11 +8,16 @@ import 'dart:convert'; import 'dart:html' as html; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart' as ui; import 'package:ui/src/engine.dart'; -Future main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { await ui.webOnlyInitializeTestDomRenderer(); group('loadFontFromList', () { const String _testFontUrl = 'packages/ui/assets/ahem.ttf'; diff --git a/lib/web_ui/test/text/line_breaker_test.dart b/lib/web_ui/test/text/line_breaker_test.dart index b1a29013a1006..f536729faeeaa 100644 --- a/lib/web_ui/test/text/line_breaker_test.dart +++ b/lib/web_ui/test/text/line_breaker_test.dart @@ -3,6 +3,7 @@ // found in the LICENSE file. // @dart = 2.10 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -11,6 +12,10 @@ import 'package:ui/ui.dart'; import 'line_breaker_test_data.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('nextLineBreak', () { test('Does not go beyond the ends of a string', () { expect(split('foo'), [ diff --git a/lib/web_ui/test/text/measurement_test.dart b/lib/web_ui/test/text/measurement_test.dart index 5e5e61d65b2e5..dbe170b74e2d9 100644 --- a/lib/web_ui/test/text/measurement_test.dart +++ b/lib/web_ui/test/text/measurement_test.dart @@ -5,10 +5,12 @@ // @dart = 2.6 @TestOn('chrome || firefox') +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; + import 'package:ui/ui.dart' as ui; import 'package:ui/src/engine.dart'; -import 'package:test/test.dart'; final ui.ParagraphStyle ahemStyle = ui.ParagraphStyle( fontFamily: 'ahem', @@ -47,8 +49,11 @@ void testMeasurements(String description, MeasurementTestBody body, { skip: skipCanvas, ); } +void main() { + internalBootstrapBrowserTest(() => testMain); +} -void main() async { +void testMain() async { await ui.webOnlyInitializeTestDomRenderer(); group('$RulerManager', () { diff --git a/lib/web_ui/test/text/word_breaker_test.dart b/lib/web_ui/test/text/word_breaker_test.dart index 54ae7dd33c6cb..15966c9bce2ec 100644 --- a/lib/web_ui/test/text/word_breaker_test.dart +++ b/lib/web_ui/test/text/word_breaker_test.dart @@ -3,11 +3,16 @@ // found in the LICENSE file. // @dart = 2.6 +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { group('$WordBreaker', () { test('Does not go beyond the ends of a string', () { expect(WordBreaker.prevBreakIndex('foo', 0), 0); diff --git a/lib/web_ui/test/text_editing_test.dart b/lib/web_ui/test/text_editing_test.dart index dab4297fbb0db..8e5eeb36a31ea 100644 --- a/lib/web_ui/test/text_editing_test.dart +++ b/lib/web_ui/test/text_editing_test.dart @@ -8,10 +8,11 @@ import 'dart:html'; import 'dart:js_util' as js_util; import 'dart:typed_data'; -import 'package:ui/src/engine.dart' hide window; - +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; +import 'package:ui/src/engine.dart' hide window; + import 'matchers.dart'; import 'spy.dart'; @@ -57,6 +58,10 @@ void trackInputAction(String inputAction) { } void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { tearDown(() { lastEditingState = null; lastInputAction = null; diff --git a/lib/web_ui/test/text_test.dart b/lib/web_ui/test/text_test.dart index 266d88d1eecae..35861b2eda6c0 100644 --- a/lib/web_ui/test/text_test.dart +++ b/lib/web_ui/test/text_test.dart @@ -5,6 +5,7 @@ // @dart = 2.6 import 'dart:html'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/ui.dart'; @@ -12,7 +13,11 @@ import 'package:ui/src/engine.dart'; import 'matchers.dart'; -void main() async { +void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() async { const double baselineRatio = 1.1662499904632568; await webOnlyInitializeTestDomRenderer(); diff --git a/lib/web_ui/test/title_test.dart b/lib/web_ui/test/title_test.dart index c076e2acdd138..af366760e49b9 100644 --- a/lib/web_ui/test/title_test.dart +++ b/lib/web_ui/test/title_test.dart @@ -5,11 +5,16 @@ // @dart = 2.6 import 'dart:html'; +import 'package:test/bootstrap/browser.dart'; +import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; import 'package:ui/ui.dart' as ui; -import 'package:test/test.dart'; void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { const MethodCodec codec = JSONMethodCodec(); group('Title', () { diff --git a/lib/web_ui/test/window_test.dart b/lib/web_ui/test/window_test.dart index 8924a06798d5f..44894d8bc8dfe 100644 --- a/lib/web_ui/test/window_test.dart +++ b/lib/web_ui/test/window_test.dart @@ -8,6 +8,7 @@ import 'dart:html' as html; import 'dart:js_util' as js_util; import 'dart:typed_data'; +import 'package:test/bootstrap/browser.dart'; import 'package:test/test.dart'; import 'package:ui/src/engine.dart'; @@ -16,6 +17,10 @@ const MethodCodec codec = JSONMethodCodec(); void emptyCallback(ByteData date) {} void main() { + internalBootstrapBrowserTest(() => testMain); +} + +void testMain() { test('window.defaultRouteName should not change', () { window.locationStrategy = TestLocationStrategy.fromEntry(TestHistoryEntry('initial state', null, '/initial')); expect(window.defaultRouteName, '/initial');