| Index: runtime/observatory/tests/service/test_helper.dart
|
| diff --git a/runtime/observatory/tests/service/test_helper.dart b/runtime/observatory/tests/service/test_helper.dart
|
| index 5078203e7bf32619c5a9e863bc6a93d9fcd86b61..32397502e288e0befa45b805cedf495278859937 100644
|
| --- a/runtime/observatory/tests/service/test_helper.dart
|
| +++ b/runtime/observatory/tests/service/test_helper.dart
|
| @@ -16,9 +16,7 @@ String serviceHttpAddress;
|
| String serviceWebsocketAddress;
|
|
|
| const String _TESTEE_ENV_KEY = 'SERVICE_TEST_TESTEE';
|
| -const Map<String, String> _TESTEE_SPAWN_ENV = const {
|
| - _TESTEE_ENV_KEY: 'true'
|
| -};
|
| +const Map<String, String> _TESTEE_SPAWN_ENV = const {_TESTEE_ENV_KEY: 'true'};
|
| bool _isTestee() {
|
| return Platform.environment.containsKey(_TESTEE_ENV_KEY);
|
| }
|
| @@ -27,15 +25,17 @@ const String _SKY_SHELL_ENV_KEY = 'SERVICE_TEST_SKY_SHELL';
|
| bool _shouldLaunchSkyShell() {
|
| return Platform.environment.containsKey(_SKY_SHELL_ENV_KEY);
|
| }
|
| +
|
| String _skyShellPath() {
|
| return Platform.environment[_SKY_SHELL_ENV_KEY];
|
| }
|
|
|
| class _ServiceTesteeRunner {
|
| - Future run({testeeBefore(): null,
|
| - testeeConcurrent(): null,
|
| - bool pause_on_start: false,
|
| - bool pause_on_exit: false}) async {
|
| + Future run(
|
| + {testeeBefore(): null,
|
| + testeeConcurrent(): null,
|
| + bool pause_on_start: false,
|
| + bool pause_on_exit: false}) async {
|
| if (!pause_on_start) {
|
| if (testeeBefore != null) {
|
| var result = testeeBefore();
|
| @@ -57,10 +57,11 @@ class _ServiceTesteeRunner {
|
| }
|
| }
|
|
|
| - void runSync({void testeeBeforeSync(): null,
|
| - void testeeConcurrentSync(): null,
|
| - bool pause_on_start: false,
|
| - bool pause_on_exit: false}) {
|
| + void runSync(
|
| + {void testeeBeforeSync(): null,
|
| + void testeeConcurrentSync(): null,
|
| + bool pause_on_start: false,
|
| + bool pause_on_exit: false}) {
|
| if (!pause_on_start) {
|
| if (testeeBeforeSync != null) {
|
| testeeBeforeSync();
|
| @@ -82,16 +83,16 @@ class _ServiceTesteeLauncher {
|
| final List<String> args;
|
| bool killedByTester = false;
|
|
|
| - _ServiceTesteeLauncher() :
|
| - args = [Platform.script.toFilePath()] {}
|
| + _ServiceTesteeLauncher() : args = [Platform.script.toFilePath()] {}
|
|
|
| // Spawn the testee process.
|
| - Future<Process> _spawnProcess(bool pause_on_start,
|
| - bool pause_on_exit,
|
| - bool pause_on_unhandled_exceptions,
|
| - bool testeeControlsServer,
|
| - bool useAuthToken,
|
| - List<String> extraArgs) {
|
| + Future<Process> _spawnProcess(
|
| + bool pause_on_start,
|
| + bool pause_on_exit,
|
| + bool pause_on_unhandled_exceptions,
|
| + bool testeeControlsServer,
|
| + bool useAuthToken,
|
| + List<String> extraArgs) {
|
| assert(pause_on_start != null);
|
| assert(pause_on_exit != null);
|
| assert(pause_on_unhandled_exceptions != null);
|
| @@ -99,27 +100,26 @@ class _ServiceTesteeLauncher {
|
| assert(useAuthToken != null);
|
|
|
| if (_shouldLaunchSkyShell()) {
|
| - return _spawnSkyProcess(pause_on_start,
|
| - pause_on_exit,
|
| - pause_on_unhandled_exceptions,
|
| - testeeControlsServer,
|
| - extraArgs);
|
| + return _spawnSkyProcess(pause_on_start, pause_on_exit,
|
| + pause_on_unhandled_exceptions, testeeControlsServer, extraArgs);
|
| } else {
|
| - return _spawnDartProcess(pause_on_start,
|
| - pause_on_exit,
|
| - pause_on_unhandled_exceptions,
|
| - testeeControlsServer,
|
| - useAuthToken,
|
| - extraArgs);
|
| + return _spawnDartProcess(
|
| + pause_on_start,
|
| + pause_on_exit,
|
| + pause_on_unhandled_exceptions,
|
| + testeeControlsServer,
|
| + useAuthToken,
|
| + extraArgs);
|
| }
|
| }
|
|
|
| - Future<Process> _spawnDartProcess(bool pause_on_start,
|
| - bool pause_on_exit,
|
| - bool pause_on_unhandled_exceptions,
|
| - bool testeeControlsServer,
|
| - bool useAuthToken,
|
| - List<String> extraArgs) {
|
| + Future<Process> _spawnDartProcess(
|
| + bool pause_on_start,
|
| + bool pause_on_exit,
|
| + bool pause_on_unhandled_exceptions,
|
| + bool testeeControlsServer,
|
| + bool useAuthToken,
|
| + List<String> extraArgs) {
|
| assert(!_shouldLaunchSkyShell());
|
|
|
| String dartExecutable = Platform.executable;
|
| @@ -144,19 +144,16 @@ class _ServiceTesteeLauncher {
|
| }
|
| fullArgs.addAll(args);
|
|
|
| - return _spawnCommon(
|
| - dartExecutable,
|
| - fullArgs,
|
| - <String, String>{
|
| - 'DART_SERVICE_USE_AUTH': '$useAuthToken'
|
| - });
|
| + return _spawnCommon(dartExecutable, fullArgs,
|
| + <String, String>{'DART_SERVICE_USE_AUTH': '$useAuthToken'});
|
| }
|
|
|
| - Future<Process> _spawnSkyProcess(bool pause_on_start,
|
| - bool pause_on_exit,
|
| - bool pause_on_unhandled_exceptions,
|
| - bool testeeControlsServer,
|
| - List<String> extraArgs) {
|
| + Future<Process> _spawnSkyProcess(
|
| + bool pause_on_start,
|
| + bool pause_on_exit,
|
| + bool pause_on_unhandled_exceptions,
|
| + bool testeeControlsServer,
|
| + List<String> extraArgs) {
|
| assert(_shouldLaunchSkyShell());
|
|
|
| String dartExecutable = _skyShellPath();
|
| @@ -189,9 +186,8 @@ class _ServiceTesteeLauncher {
|
| return _spawnCommon(dartExecutable, fullArgs, <String, String>{});
|
| }
|
|
|
| - Future<Process> _spawnCommon(String executable,
|
| - List<String> arguments,
|
| - Map<String, String> dartEnvironment) {
|
| + Future<Process> _spawnCommon(String executable, List<String> arguments,
|
| + Map<String, String> dartEnvironment) {
|
| var environment = _TESTEE_SPAWN_ENV;
|
| var bashEnvironment = new StringBuffer();
|
| environment.forEach((k, v) => bashEnvironment.write("$k=$v "));
|
| @@ -204,25 +200,29 @@ class _ServiceTesteeLauncher {
|
| return Process.start(executable, arguments, environment: environment);
|
| }
|
|
|
| - Future<Uri> launch(bool pause_on_start,
|
| - bool pause_on_exit,
|
| - bool pause_on_unhandled_exceptions,
|
| - bool testeeControlsServer,
|
| - bool useAuthToken,
|
| - List<String> extraArgs) {
|
| - return _spawnProcess(pause_on_start,
|
| - pause_on_exit,
|
| - pause_on_unhandled_exceptions,
|
| - testeeControlsServer,
|
| - useAuthToken,
|
| - extraArgs).then((p) {
|
| + Future<Uri> launch(
|
| + bool pause_on_start,
|
| + bool pause_on_exit,
|
| + bool pause_on_unhandled_exceptions,
|
| + bool testeeControlsServer,
|
| + bool useAuthToken,
|
| + List<String> extraArgs) {
|
| + return _spawnProcess(
|
| + pause_on_start,
|
| + pause_on_exit,
|
| + pause_on_unhandled_exceptions,
|
| + testeeControlsServer,
|
| + useAuthToken,
|
| + extraArgs).then((p) {
|
| Completer<Uri> completer = new Completer<Uri>();
|
| process = p;
|
| Uri uri;
|
| var blank;
|
| var first = true;
|
| - process.stdout.transform(UTF8.decoder)
|
| - .transform(new LineSplitter()).listen((line) {
|
| + process.stdout
|
| + .transform(UTF8.decoder)
|
| + .transform(new LineSplitter())
|
| + .listen((line) {
|
| const kObservatoryListening = 'Observatory listening on ';
|
| if (line.startsWith(kObservatoryListening)) {
|
| uri = Uri.parse(line.substring(kObservatoryListening.length));
|
| @@ -239,8 +239,10 @@ class _ServiceTesteeLauncher {
|
| }
|
| print('>testee>out> $line');
|
| });
|
| - process.stderr.transform(UTF8.decoder)
|
| - .transform(new LineSplitter()).listen((line) {
|
| + process.stderr
|
| + .transform(UTF8.decoder)
|
| + .transform(new LineSplitter())
|
| + .listen((line) {
|
| print('>testee>err> $line');
|
| });
|
| process.exitCode.then((exitCode) {
|
| @@ -264,28 +266,28 @@ class _ServiceTesteeLauncher {
|
| void setupAddresses(Uri serverAddress) {
|
| serviceWebsocketAddress =
|
| 'ws://${serverAddress.authority}${serverAddress.path}ws';
|
| - serviceHttpAddress =
|
| - 'http://${serverAddress.authority}${serverAddress.path}';
|
| + serviceHttpAddress = 'http://${serverAddress.authority}${serverAddress.path}';
|
| }
|
|
|
| class _ServiceTesterRunner {
|
| - void run({List<String> mainArgs,
|
| - List<String> extraArgs,
|
| - List<VMTest> vmTests,
|
| - List<IsolateTest> isolateTests,
|
| - bool pause_on_start: false,
|
| - bool pause_on_exit: false,
|
| - bool verbose_vm: false,
|
| - bool pause_on_unhandled_exceptions: false,
|
| - bool testeeControlsServer: false,
|
| - bool useAuthToken: false}) {
|
| + void run(
|
| + {List<String> mainArgs,
|
| + List<String> extraArgs,
|
| + List<VMTest> vmTests,
|
| + List<IsolateTest> isolateTests,
|
| + bool pause_on_start: false,
|
| + bool pause_on_exit: false,
|
| + bool verbose_vm: false,
|
| + bool pause_on_unhandled_exceptions: false,
|
| + bool testeeControlsServer: false,
|
| + bool useAuthToken: false}) {
|
| var process = new _ServiceTesteeLauncher();
|
| bool testsDone = false;
|
| runZoned(() {
|
| - process.launch(pause_on_start, pause_on_exit,
|
| - pause_on_unhandled_exceptions,
|
| - testeeControlsServer,
|
| - useAuthToken, extraArgs).then((Uri serverAddress) async {
|
| + process
|
| + .launch(pause_on_start, pause_on_exit, pause_on_unhandled_exceptions,
|
| + testeeControlsServer, useAuthToken, extraArgs)
|
| + .then((Uri serverAddress) async {
|
| if (mainArgs.contains("--gdb")) {
|
| var pid = process.process.pid;
|
| var wait = new Duration(seconds: 10);
|
| @@ -332,7 +334,7 @@ class _ServiceTesterRunner {
|
| }, onError: (error, stackTrace) async {
|
| if (testsDone) {
|
| print('Ignoring late exception during process exit:\n'
|
| - '$error\n#stackTrace');
|
| + '$error\n#stackTrace');
|
| } else {
|
| await process.requestExit();
|
| print('Unexpected exception in service tests: $error\n$stackTrace');
|
| @@ -388,23 +390,23 @@ class _ServiceTesterRunner {
|
| /// return a [Future]. Code for setting up state can run before and/or
|
| /// concurrently with the tests. Uses [mainArgs] to determine whether
|
| /// to run tests or testee in this invokation of the script.
|
| -Future runIsolateTests(List<String> mainArgs,
|
| - List<IsolateTest> tests,
|
| - {testeeBefore(),
|
| - testeeConcurrent(),
|
| - bool pause_on_start: false,
|
| - bool pause_on_exit: false,
|
| - bool verbose_vm: false,
|
| - bool pause_on_unhandled_exceptions: false,
|
| - bool testeeControlsServer: false,
|
| - bool useAuthToken: false,
|
| - List<String> extraArgs}) async {
|
| +Future runIsolateTests(List<String> mainArgs, List<IsolateTest> tests,
|
| + {testeeBefore(),
|
| + testeeConcurrent(),
|
| + bool pause_on_start: false,
|
| + bool pause_on_exit: false,
|
| + bool verbose_vm: false,
|
| + bool pause_on_unhandled_exceptions: false,
|
| + bool testeeControlsServer: false,
|
| + bool useAuthToken: false,
|
| + List<String> extraArgs}) async {
|
| assert(!pause_on_start || testeeBefore == null);
|
| if (_isTestee()) {
|
| - new _ServiceTesteeRunner().run(testeeBefore: testeeBefore,
|
| - testeeConcurrent: testeeConcurrent,
|
| - pause_on_start: pause_on_start,
|
| - pause_on_exit: pause_on_exit);
|
| + new _ServiceTesteeRunner().run(
|
| + testeeBefore: testeeBefore,
|
| + testeeConcurrent: testeeConcurrent,
|
| + pause_on_start: pause_on_start,
|
| + pause_on_exit: pause_on_exit);
|
| } else {
|
| new _ServiceTesterRunner().run(
|
| mainArgs: mainArgs,
|
| @@ -428,21 +430,21 @@ Future runIsolateTests(List<String> mainArgs,
|
| /// pause_on_unhandled_exceptions_test, which cannot properly function
|
| /// in an async context (because exceptions are *always* handled in async
|
| /// functions).
|
| -void runIsolateTestsSynchronous(List<String> mainArgs,
|
| - List<IsolateTest> tests,
|
| - {void testeeBefore(),
|
| - void testeeConcurrent(),
|
| - bool pause_on_start: false,
|
| - bool pause_on_exit: false,
|
| - bool verbose_vm: false,
|
| - bool pause_on_unhandled_exceptions: false,
|
| - List<String> extraArgs}) {
|
| +void runIsolateTestsSynchronous(List<String> mainArgs, List<IsolateTest> tests,
|
| + {void testeeBefore(),
|
| + void testeeConcurrent(),
|
| + bool pause_on_start: false,
|
| + bool pause_on_exit: false,
|
| + bool verbose_vm: false,
|
| + bool pause_on_unhandled_exceptions: false,
|
| + List<String> extraArgs}) {
|
| assert(!pause_on_start || testeeBefore == null);
|
| if (_isTestee()) {
|
| - new _ServiceTesteeRunner().runSync(testeeBeforeSync: testeeBefore,
|
| - testeeConcurrentSync: testeeConcurrent,
|
| - pause_on_start: pause_on_start,
|
| - pause_on_exit: pause_on_exit);
|
| + new _ServiceTesteeRunner().runSync(
|
| + testeeBeforeSync: testeeBefore,
|
| + testeeConcurrentSync: testeeConcurrent,
|
| + pause_on_start: pause_on_start,
|
| + pause_on_exit: pause_on_exit);
|
| } else {
|
| new _ServiceTesterRunner().run(
|
| mainArgs: mainArgs,
|
| @@ -455,25 +457,24 @@ void runIsolateTestsSynchronous(List<String> mainArgs,
|
| }
|
| }
|
|
|
| -
|
| /// Runs [tests] in sequence, each of which should take an [Isolate] and
|
| /// return a [Future]. Code for setting up state can run before and/or
|
| /// concurrently with the tests. Uses [mainArgs] to determine whether
|
| /// to run tests or testee in this invokation of the script.
|
| -Future runVMTests(List<String> mainArgs,
|
| - List<VMTest> tests,
|
| - {testeeBefore(),
|
| - testeeConcurrent(),
|
| - bool pause_on_start: false,
|
| - bool pause_on_exit: false,
|
| - bool verbose_vm: false,
|
| - bool pause_on_unhandled_exceptions: false,
|
| - List<String> extraArgs}) async {
|
| +Future runVMTests(List<String> mainArgs, List<VMTest> tests,
|
| + {testeeBefore(),
|
| + testeeConcurrent(),
|
| + bool pause_on_start: false,
|
| + bool pause_on_exit: false,
|
| + bool verbose_vm: false,
|
| + bool pause_on_unhandled_exceptions: false,
|
| + List<String> extraArgs}) async {
|
| if (_isTestee()) {
|
| - new _ServiceTesteeRunner().run(testeeBefore: testeeBefore,
|
| - testeeConcurrent: testeeConcurrent,
|
| - pause_on_start: pause_on_start,
|
| - pause_on_exit: pause_on_exit);
|
| + new _ServiceTesteeRunner().run(
|
| + testeeBefore: testeeBefore,
|
| + testeeConcurrent: testeeConcurrent,
|
| + pause_on_start: pause_on_start,
|
| + pause_on_exit: pause_on_exit);
|
| } else {
|
| new _ServiceTesterRunner().run(
|
| mainArgs: mainArgs,
|
|
|