diff --git a/dwds/test/fixtures/context.dart b/dwds/test/fixtures/context.dart index 73c1b0ca9..600987c8f 100644 --- a/dwds/test/fixtures/context.dart +++ b/dwds/test/fixtures/context.dart @@ -176,7 +176,7 @@ class TestContext { }) async { // Generate missing SDK assets if needed. final sdkConfigurationProvider = - TestSdkConfigurationProvider(verboseCompiler: verboseCompiler); + TestSdkConfigurationProvider(verbose: verboseCompiler); final sdkLayout = sdkConfigurationProvider.sdkLayout; final configuration = await sdkConfigurationProvider.configuration; configuration.validate(); diff --git a/test_common/lib/sdk_asset_generator.dart b/test_common/lib/sdk_asset_generator.dart index 5d6061137..e9584e24d 100644 --- a/test_common/lib/sdk_asset_generator.dart +++ b/test_common/lib/sdk_asset_generator.dart @@ -17,14 +17,14 @@ class SdkAssetGenerator { final _logger = Logger('SdkAssetGenerator'); final FileSystem fileSystem; - final bool verboseCompiler; + final bool verbose; late final TestSdkLayout sdkLayout; SdkAssetGenerator({ this.fileSystem = const LocalFileSystem(), required this.sdkLayout, - this.verboseCompiler = false, + this.verbose = false, }); /// Generate all SDK assets, once for the current executable run. @@ -180,7 +180,7 @@ class SdkAssetGenerator { '--no-sound-null-safety', '--output', summaryPath, - if (verboseCompiler) '--verbose', + if (verbose) '--verbose', ]; _logger.fine('Executing dart ${args.join(' ')}'); diff --git a/test_common/lib/test_sdk_configuration.dart b/test_common/lib/test_sdk_configuration.dart index dabb616e0..902d6fe77 100644 --- a/test_common/lib/test_sdk_configuration.dart +++ b/test_common/lib/test_sdk_configuration.dart @@ -57,7 +57,7 @@ class TestSdkCopyConfigurationProvider extends SdkConfigurationProvider { try { final assetGenerator = SdkAssetGenerator( sdkLayout: sdkLayout, - verboseCompiler: _verbose, + verbose: _verbose, ); await assetGenerator.generateSdkAssets(); @@ -92,13 +92,12 @@ class TestSdkCopyConfigurationProvider extends SdkConfigurationProvider { /// TODO(annagrin): update to only generating missing sound artifacts /// for frontend server after we have no uses of weak null safety. class TestSdkConfigurationProvider extends SdkConfigurationProvider { - final bool _verboseCompiler; + final bool _verbose; SdkConfiguration? _configuration; final sdkLayout = TestSdkLayout.defaultSdkLayout; - TestSdkConfigurationProvider({bool verboseCompiler = false}) - : _verboseCompiler = verboseCompiler; + TestSdkConfigurationProvider({bool verbose = false}) : _verbose = verbose; @override Future get configuration async => @@ -108,7 +107,7 @@ class TestSdkConfigurationProvider extends SdkConfigurationProvider { Future _create() async { final assetGenerator = SdkAssetGenerator( sdkLayout: sdkLayout, - verboseCompiler: _verboseCompiler, + verbose: _verbose, ); await assetGenerator.generateSdkAssets(); diff --git a/test_common/test/sdk_asset_generator_test.dart b/test_common/test/sdk_asset_generator_test.dart index 5c54ceadd..79c98df22 100644 --- a/test_common/test/sdk_asset_generator_test.dart +++ b/test_common/test/sdk_asset_generator_test.dart @@ -76,7 +76,7 @@ void main() { final configuration = TestSdkLayout.createConfiguration(sdkLayout); final assetGenerator = - SdkAssetGenerator(sdkLayout: sdkLayout, verboseCompiler: true); + SdkAssetGenerator(sdkLayout: sdkLayout, verbose: true); await assetGenerator.generateSdkAssets(); // Make sure SDK configuration and asset generator agree on the file paths. diff --git a/webdev/test/daemon/app_domain_test.dart b/webdev/test/daemon/app_domain_test.dart index ad6f6735e..546172400 100644 --- a/webdev/test/daemon/app_domain_test.dart +++ b/webdev/test/daemon/app_domain_test.dart @@ -14,39 +14,43 @@ import 'utils.dart'; void main() { late String exampleDirectory; + final testRunner = TestRunner(); setUpAll(() async { - exampleDirectory = await prepareWorkspace(); + await testRunner.setUpAll(); + exampleDirectory = await testRunner.prepareWorkspace(); }); + tearDownAll(testRunner.tearDownAll); + group('AppDomain', () { group('Events', () { test('.start', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); await expectLater( webdev.stdout, emitsThrough(startsWith('[{"event":"app.start"'))); await exitWebdev(webdev); }); test('.started', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); await expectLater( webdev.stdout, emitsThrough(startsWith('[{"event":"app.started"'))); await exitWebdev(webdev); }); test('.debugPort', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); await expectLater(webdev.stdout, emitsThrough(startsWith('[{"event":"app.debugPort"'))); await exitWebdev(webdev); }); test('.log', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); var appId = await waitForAppId(webdev); // The example app does an initial print. await expectLater( @@ -60,8 +64,8 @@ void main() { group('Methods', () { test('.callServiceExtension', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); var appId = await waitForAppId(webdev); if (Platform.isWindows) { // Windows takes a bit longer to run the application and register @@ -81,8 +85,8 @@ void main() { }); test('.reload', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); var appId = await waitForAppId(webdev); var extensionCall = '[{"method":"app.restart","id":0,' '"params" : { "appId" : "$appId", "fullRestart" : false}}]'; @@ -97,8 +101,8 @@ void main() { }); test('.restart', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); var appId = await waitForAppId(webdev); var extensionCall = '[{"method":"app.restart","id":0,' '"params" : { "appId" : "$appId", "fullRestart" : true}}]'; @@ -117,8 +121,8 @@ void main() { }); test('.stop', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); var appId = await waitForAppId(webdev); var stopCall = '[{"method":"app.stop","id":0,' '"params" : { "appId" : "$appId"}}]'; diff --git a/webdev/test/daemon/daemon_domain_test.dart b/webdev/test/daemon/daemon_domain_test.dart index a7102a622..45cfdf07d 100644 --- a/webdev/test/daemon/daemon_domain_test.dart +++ b/webdev/test/daemon/daemon_domain_test.dart @@ -14,15 +14,19 @@ import 'utils.dart'; void main() { late String exampleDirectory; + final testRunner = TestRunner(); setUpAll(() async { - exampleDirectory = await prepareWorkspace(); + await testRunner.setUpAll(); + exampleDirectory = await testRunner.prepareWorkspace(); }); + tearDownAll(testRunner.tearDownAll); + group('Daemon', () { group('Events', () { test('.connected', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); await expectLater( webdev.stdout, emits(startsWith('[{"event":"daemon.connected"'))); await exitWebdev(webdev); @@ -31,8 +35,8 @@ void main() { group('Methods', () { test('.version', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); webdev.stdin.add(utf8.encode('[{"method":"daemon.version","id":0}]\n')); await expectLater( webdev.stdout, emitsThrough(equals('[{"id":0,"result":"0.4.2"}]'))); @@ -40,8 +44,8 @@ void main() { }); test('.shutdown', () async { - var webdev = - await runWebDev(['daemon'], workingDirectory: exampleDirectory); + var webdev = await testRunner + .runWebDev(['daemon'], workingDirectory: exampleDirectory); webdev.stdin .add(utf8.encode('[{"method":"daemon.shutdown","id":0}]\n')); await expectLater(webdev.stdout, emitsThrough(equals('[{"id":0}]'))); diff --git a/webdev/test/daemon/launch_app_test.dart b/webdev/test/daemon/launch_app_test.dart index 9818e7ba9..d37e74ac0 100644 --- a/webdev/test/daemon/launch_app_test.dart +++ b/webdev/test/daemon/launch_app_test.dart @@ -11,12 +11,17 @@ import 'utils.dart'; void main() { late String exampleDirectory; + final testRunner = TestRunner(); setUpAll(() async { - exampleDirectory = await prepareWorkspace(); + await testRunner.setUpAll(); + exampleDirectory = await testRunner.prepareWorkspace(); }); + tearDownAll(testRunner.tearDownAll); + test('--launch-app launches the specified app', () async { - var webdev = await runWebDev(['daemon', '--launch-app=web/scopes.html'], + var webdev = await testRunner.runWebDev( + ['daemon', '--launch-app=web/scopes.html'], workingDirectory: exampleDirectory); var appId = await waitForAppId(webdev); diff --git a/webdev/test/daemon/utils.dart b/webdev/test/daemon/utils.dart index f124a2fcd..edc856ce7 100644 --- a/webdev/test/daemon/utils.dart +++ b/webdev/test/daemon/utils.dart @@ -5,13 +5,9 @@ import 'dart:async'; import 'dart:convert'; -import 'package:path/path.dart' as p; import 'package:test/test.dart'; import 'package:test_process/test_process.dart'; import 'package:vm_service/vm_service.dart'; -import 'package:webdev/src/util.dart'; - -import '../test_utils.dart'; const isRPCError = TypeMatcher(); @@ -37,17 +33,6 @@ Future waitForAppId(TestProcess webdev) async { return appId; } -Future prepareWorkspace() async { - var exampleDirectory = - p.absolute(p.join(p.current, '..', 'fixtures', '_webdevSoundSmoke')); - - var process = await TestProcess.start(dartPath, ['pub', 'upgrade'], - workingDirectory: exampleDirectory, environment: getPubEnvironment()); - - await process.shouldExit(0); - return exampleDirectory; -} - String? getDebugServiceUri(String line) { var regex = RegExp(r'Debug service listening on (?[^\s^\\]*)'); var match = regex.firstMatch(line); diff --git a/webdev/test/e2e_test.dart b/webdev/test/e2e_test.dart index 8d706a434..6c6d09248 100644 --- a/webdev/test/e2e_test.dart +++ b/webdev/test/e2e_test.dart @@ -36,10 +36,12 @@ void main() { // Change to true for debugging. final debug = false; + final testRunner = TestRunner(); late String exampleDirectory; late String soundExampleDirectory; setUpAll(() async { configureLogWriter(debug); + await testRunner.setUpAll(); exampleDirectory = p.absolute(p.join(p.current, '..', 'fixtures', '_webdevSmoke')); soundExampleDirectory = @@ -62,6 +64,8 @@ void main() { await d.file('pubspec.lock', isNotEmpty).validate(soundExampleDirectory); }); + tearDownAll(testRunner.tearDownAll); + test('smoke test is configured properly', () async { var smokeYaml = loadYaml( await File('$soundExampleDirectory/pubspec.yaml').readAsString()) @@ -81,8 +85,8 @@ void main() { var args = ['build', '-o', 'web:${d.sandbox}']; - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); // NOTE: We'd like this to be more useful // See https://github.com/dart-lang/build/issues/1283 @@ -109,8 +113,8 @@ void main() { '--delete-conflicting-outputs' ]; - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); await checkProcessStdout(process, ['Succeeded']); await process.shouldExit(0); @@ -124,8 +128,8 @@ void main() { args.add('--no-release'); } - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); var expectedItems = ['Succeeded']; @@ -152,8 +156,8 @@ void main() { '--null-safety=sound' ]; - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); var expectedItems = ['Succeeded']; @@ -172,7 +176,8 @@ void main() { '--null-safety=unsound' ]; - var process = await runWebDev(args, workingDirectory: exampleDirectory); + var process = + await testRunner.runWebDev(args, workingDirectory: exampleDirectory); var expectedItems = ['Succeeded']; @@ -191,8 +196,8 @@ void main() { args.add('--no-release'); } - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); var expectedItems = ['Succeeded']; @@ -214,8 +219,8 @@ void main() { args.add('--release'); } - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); var hostUrl = 'http://localhost:$openPort'; @@ -256,8 +261,8 @@ void main() { if (command == 'build') '--output=$dir:foo' else dir ]; - var process = - await runWebDev(args, workingDirectory: soundExampleDirectory); + var process = await testRunner.runWebDev(args, + workingDirectory: soundExampleDirectory); await expectLater( process.stdout, emitsThrough(contains( @@ -294,7 +299,7 @@ void main() { '--null-safety=$nullSafetyOption', '--verbose', ]; - var process = await runWebDev(args, + var process = await testRunner.runWebDev(args, workingDirectory: soundNullSafety ? soundExampleDirectory : exampleDirectory); VmService? vmService; @@ -360,7 +365,7 @@ void main() { '--enable-expression-evaluation', '--verbose', ]; - var process = await runWebDev(args, + var process = await testRunner.runWebDev(args, workingDirectory: soundNullSafety ? soundExampleDirectory : exampleDirectory); VmService? vmService; @@ -418,7 +423,7 @@ void main() { '--no-enable-expression-evaluation', '--verbose', ]; - var process = await runWebDev(args, + var process = await testRunner.runWebDev(args, workingDirectory: soundNullSafety ? soundExampleDirectory : exampleDirectory); VmService? vmService; @@ -473,7 +478,7 @@ void main() { '--no-enable-expression-evaluation', '--verbose', ]; - var process = await runWebDev(args, + var process = await testRunner.runWebDev(args, workingDirectory: soundNullSafety ? soundExampleDirectory : exampleDirectory); VmService? vmService; diff --git a/webdev/test/integration_test.dart b/webdev/test/integration_test.dart index 2e9154388..6739b8bdf 100644 --- a/webdev/test/integration_test.dart +++ b/webdev/test/integration_test.dart @@ -18,8 +18,12 @@ void main() { var pubCommand = sdkVersion.compareTo(firstSdkVersionWithoutPub) < 0 ? 'pub' : 'dart pub'; + final testRunner = TestRunner(); + setUpAll(testRunner.setUpAll); + tearDownAll(testRunner.tearDownAll); + test('non-existant commands create errors', () async { - var process = await runWebDev(['monkey']); + var process = await testRunner.runWebDev(['monkey']); await expectLater( process.stdout, emits('Could not find a command named "monkey".')); @@ -28,7 +32,7 @@ void main() { }); test('passing extra args to build fails with bad usage', () async { - var process = await runWebDev(['build', 'extra', 'args']); + var process = await testRunner.runWebDev(['build', 'extra', 'args']); await expectLater(process.stdout, emits('Arguments were provided that are not supported: "extra args".')); @@ -55,7 +59,8 @@ name: sample await d.file('.dart_tool/package_config.json', ''' ''').create(); - var process = await runWebDev(['serve'], workingDirectory: d.sandbox); + var process = + await testRunner.runWebDev(['serve'], workingDirectory: d.sandbox); var output = await process.stdout.rest.toList(); @@ -87,7 +92,8 @@ name: sample await d.file('.dart_tool/package_config.json', ''' ''').create(); - var process = await runWebDev([command], workingDirectory: d.sandbox); + var process = await testRunner + .runWebDev([command], workingDirectory: d.sandbox); await checkProcessStdout(process, [ 'webdev could not run for this project.', @@ -110,7 +116,8 @@ name: sample await d.file('.dart_tool/package_config.json', ''' ''').create(); - var process = await runWebDev(['serve'], workingDirectory: d.sandbox); + var process = await testRunner + .runWebDev(['serve'], workingDirectory: d.sandbox); await checkProcessStdout(process, [ 'webdev could not run for this project.', @@ -138,7 +145,8 @@ name: sample // Required for webdev to not complain about nothing to serve. await d.dir('web').create(); - var process = await runWebDev(['serve', '--no-build-web-compilers'], + var process = await testRunner.runWebDev( + ['serve', '--no-build-web-compilers'], workingDirectory: d.sandbox); // Fails since this is a fake package @@ -187,8 +195,8 @@ name: sample await d.file('.dart_tool/package_config.json', ''' ''').create(); - var process = - await runWebDev(['serve'], workingDirectory: d.sandbox); + var process = await testRunner + .runWebDev(['serve'], workingDirectory: d.sandbox); if (entry.key == 'build_daemon') { await checkProcessStdout(process, [ @@ -212,7 +220,8 @@ name: sample } test('no pubspec.yaml', () async { - var process = await runWebDev(['serve'], workingDirectory: d.sandbox); + var process = + await testRunner.runWebDev(['serve'], workingDirectory: d.sandbox); await checkProcessStdout(process, [ 'webdev could not run for this project.', @@ -226,7 +235,8 @@ name: sample name: sample ''').create(); - var process = await runWebDev(['serve'], workingDirectory: d.sandbox); + var process = + await testRunner.runWebDev(['serve'], workingDirectory: d.sandbox); await checkProcessStdout(process, [ 'webdev could not run for this project.', @@ -250,7 +260,8 @@ dependencies: args: ^1.0.0 ''').create(); - var process = await runWebDev(['serve'], workingDirectory: d.sandbox); + var process = + await testRunner.runWebDev(['serve'], workingDirectory: d.sandbox); await checkProcessStdout(process, [ 'webdev could not run for this project.', diff --git a/webdev/test/readme_test.dart b/webdev/test/readme_test.dart index 0f57f0f96..77def258a 100644 --- a/webdev/test/readme_test.dart +++ b/webdev/test/readme_test.dart @@ -15,14 +15,18 @@ import 'package:test/test.dart'; import 'test_utils.dart'; void main() { - test('help build', () => _readmeCheck(['help', 'build'])); - test('help serve', () => _readmeCheck(['help', 'serve'])); + final testRunner = TestRunner(); + setUpAll(testRunner.setUpAll); + tearDownAll(testRunner.tearDownAll); + + test('help build', () => _readmeCheck(testRunner, ['help', 'build'])); + test('help serve', () => _readmeCheck(testRunner, ['help', 'serve'])); } final _readmeContents = File('README.md').readAsStringSync(); -Future _readmeCheck(List args) async { - var process = await runWebDev(args); +Future _readmeCheck(TestRunner testRunner, List args) async { + var process = await testRunner.runWebDev(args); var output = (await process.stdoutStream().map((line) => line.trimRight()).join('\n')) .trim(); diff --git a/webdev/test/test_utils.dart b/webdev/test/test_utils.dart index 67ee55813..c2ec4a530 100644 --- a/webdev/test/test_utils.dart +++ b/webdev/test/test_utils.dart @@ -8,21 +8,54 @@ import 'dart:io'; import 'package:path/path.dart' as p; import 'package:test/test.dart'; import 'package:test_common/test_sdk_configuration.dart'; +import 'package:test_common/test_sdk_layout.dart'; import 'package:test_process/test_process.dart'; -import 'package:webdev/src/util.dart'; final _webdevBin = p.absolute(p.join('bin', 'webdev.dart')); -final _sdkConfigurationProvider = TestSdkConfigurationProvider(); -Future runWebDev(List args, - {String? workingDirectory}) async { - // Generate missing test assets in the SDK. - await _sdkConfigurationProvider.configuration; +class TestRunner { + late TestSdkCopyConfigurationProvider sdkConfigurationProvider; + late TestSdkLayout sdkLayout; - var fullArgs = [_webdevBin, ...args]; + Future setUpAll({bool verbose = false}) async { + // Generate missing SDK assets if needed. + sdkConfigurationProvider = + TestSdkCopyConfigurationProvider(verbose: verbose); + sdkLayout = sdkConfigurationProvider.sdkLayout; - return TestProcess.start(dartPath, fullArgs, - workingDirectory: workingDirectory); + try { + // Make sure configuration was created correctly. + final configuration = await sdkConfigurationProvider.configuration; + configuration.validate(); + } catch (_) { + tearDownAll(); + rethrow; + } + } + + void tearDownAll() { + sdkConfigurationProvider.dispose(); + } + + Future runWebDev(List args, + {String? workingDirectory}) async { + var fullArgs = [_webdevBin, ...args]; + + return TestProcess.start(sdkLayout.dartPath, fullArgs, + workingDirectory: workingDirectory); + } + + Future prepareWorkspace() async { + var exampleDirectory = + p.absolute(p.join(p.current, '..', 'fixtures', '_webdevSoundSmoke')); + + var process = await TestProcess.start( + sdkLayout.dartPath, ['pub', 'upgrade'], + workingDirectory: exampleDirectory, environment: getPubEnvironment()); + + await process.shouldExit(0); + return exampleDirectory; + } } Future checkProcessStdout(TestProcess process, List items) async {