| OLD | NEW |
| 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test_helper; | 5 library test_helper; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 import 'dart:convert'; | 8 import 'dart:convert'; |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 import 'package:observatory/service_io.dart'; | 10 import 'package:observatory/service_io.dart'; |
| 11 import 'service_test_common.dart'; | 11 import 'service_test_common.dart'; |
| 12 | 12 |
| 13 /// Will be set to the http address of the VM's service protocol before | 13 /// Will be set to the http address of the VM's service protocol before |
| 14 /// any tests are invoked. | 14 /// any tests are invoked. |
| 15 String serviceHttpAddress; | 15 String serviceHttpAddress; |
| 16 String serviceWebsocketAddress; | 16 String serviceWebsocketAddress; |
| 17 | 17 |
| 18 const String _TESTEE_ENV_KEY = 'SERVICE_TEST_TESTEE'; | 18 const String _TESTEE_ENV_KEY = 'SERVICE_TEST_TESTEE'; |
| 19 const Map<String, String> _TESTEE_SPAWN_ENV = const { | 19 const Map<String, String> _TESTEE_SPAWN_ENV = const {_TESTEE_ENV_KEY: 'true'}; |
| 20 _TESTEE_ENV_KEY: 'true' | |
| 21 }; | |
| 22 bool _isTestee() { | 20 bool _isTestee() { |
| 23 return Platform.environment.containsKey(_TESTEE_ENV_KEY); | 21 return Platform.environment.containsKey(_TESTEE_ENV_KEY); |
| 24 } | 22 } |
| 25 | 23 |
| 26 const String _SKY_SHELL_ENV_KEY = 'SERVICE_TEST_SKY_SHELL'; | 24 const String _SKY_SHELL_ENV_KEY = 'SERVICE_TEST_SKY_SHELL'; |
| 27 bool _shouldLaunchSkyShell() { | 25 bool _shouldLaunchSkyShell() { |
| 28 return Platform.environment.containsKey(_SKY_SHELL_ENV_KEY); | 26 return Platform.environment.containsKey(_SKY_SHELL_ENV_KEY); |
| 29 } | 27 } |
| 28 |
| 30 String _skyShellPath() { | 29 String _skyShellPath() { |
| 31 return Platform.environment[_SKY_SHELL_ENV_KEY]; | 30 return Platform.environment[_SKY_SHELL_ENV_KEY]; |
| 32 } | 31 } |
| 33 | 32 |
| 34 class _ServiceTesteeRunner { | 33 class _ServiceTesteeRunner { |
| 35 Future run({testeeBefore(): null, | 34 Future run( |
| 36 testeeConcurrent(): null, | 35 {testeeBefore(): null, |
| 37 bool pause_on_start: false, | 36 testeeConcurrent(): null, |
| 38 bool pause_on_exit: false}) async { | 37 bool pause_on_start: false, |
| 38 bool pause_on_exit: false}) async { |
| 39 if (!pause_on_start) { | 39 if (!pause_on_start) { |
| 40 if (testeeBefore != null) { | 40 if (testeeBefore != null) { |
| 41 var result = testeeBefore(); | 41 var result = testeeBefore(); |
| 42 if (result is Future) { | 42 if (result is Future) { |
| 43 await result; | 43 await result; |
| 44 } | 44 } |
| 45 } | 45 } |
| 46 print(''); // Print blank line to signal that testeeBefore has run. | 46 print(''); // Print blank line to signal that testeeBefore has run. |
| 47 } | 47 } |
| 48 if (testeeConcurrent != null) { | 48 if (testeeConcurrent != null) { |
| 49 var result = testeeConcurrent(); | 49 var result = testeeConcurrent(); |
| 50 if (result is Future) { | 50 if (result is Future) { |
| 51 await result; | 51 await result; |
| 52 } | 52 } |
| 53 } | 53 } |
| 54 if (!pause_on_exit) { | 54 if (!pause_on_exit) { |
| 55 // Wait around for the process to be killed. | 55 // Wait around for the process to be killed. |
| 56 stdin.first.then((_) => exit(0)); | 56 stdin.first.then((_) => exit(0)); |
| 57 } | 57 } |
| 58 } | 58 } |
| 59 | 59 |
| 60 void runSync({void testeeBeforeSync(): null, | 60 void runSync( |
| 61 void testeeConcurrentSync(): null, | 61 {void testeeBeforeSync(): null, |
| 62 bool pause_on_start: false, | 62 void testeeConcurrentSync(): null, |
| 63 bool pause_on_exit: false}) { | 63 bool pause_on_start: false, |
| 64 bool pause_on_exit: false}) { |
| 64 if (!pause_on_start) { | 65 if (!pause_on_start) { |
| 65 if (testeeBeforeSync != null) { | 66 if (testeeBeforeSync != null) { |
| 66 testeeBeforeSync(); | 67 testeeBeforeSync(); |
| 67 } | 68 } |
| 68 print(''); // Print blank line to signal that testeeBefore has run. | 69 print(''); // Print blank line to signal that testeeBefore has run. |
| 69 } | 70 } |
| 70 if (testeeConcurrentSync != null) { | 71 if (testeeConcurrentSync != null) { |
| 71 testeeConcurrentSync(); | 72 testeeConcurrentSync(); |
| 72 } | 73 } |
| 73 if (!pause_on_exit) { | 74 if (!pause_on_exit) { |
| 74 // Wait around for the process to be killed. | 75 // Wait around for the process to be killed. |
| 75 stdin.first.then((_) => exit(0)); | 76 stdin.first.then((_) => exit(0)); |
| 76 } | 77 } |
| 77 } | 78 } |
| 78 } | 79 } |
| 79 | 80 |
| 80 class _ServiceTesteeLauncher { | 81 class _ServiceTesteeLauncher { |
| 81 Process process; | 82 Process process; |
| 82 final List<String> args; | 83 final List<String> args; |
| 83 bool killedByTester = false; | 84 bool killedByTester = false; |
| 84 | 85 |
| 85 _ServiceTesteeLauncher() : | 86 _ServiceTesteeLauncher() : args = [Platform.script.toFilePath()] {} |
| 86 args = [Platform.script.toFilePath()] {} | |
| 87 | 87 |
| 88 // Spawn the testee process. | 88 // Spawn the testee process. |
| 89 Future<Process> _spawnProcess(bool pause_on_start, | 89 Future<Process> _spawnProcess( |
| 90 bool pause_on_exit, | 90 bool pause_on_start, |
| 91 bool pause_on_unhandled_exceptions, | 91 bool pause_on_exit, |
| 92 bool testeeControlsServer, | 92 bool pause_on_unhandled_exceptions, |
| 93 bool useAuthToken, | 93 bool testeeControlsServer, |
| 94 List<String> extraArgs) { | 94 bool useAuthToken, |
| 95 List<String> extraArgs) { |
| 95 assert(pause_on_start != null); | 96 assert(pause_on_start != null); |
| 96 assert(pause_on_exit != null); | 97 assert(pause_on_exit != null); |
| 97 assert(pause_on_unhandled_exceptions != null); | 98 assert(pause_on_unhandled_exceptions != null); |
| 98 assert(testeeControlsServer != null); | 99 assert(testeeControlsServer != null); |
| 99 assert(useAuthToken != null); | 100 assert(useAuthToken != null); |
| 100 | 101 |
| 101 if (_shouldLaunchSkyShell()) { | 102 if (_shouldLaunchSkyShell()) { |
| 102 return _spawnSkyProcess(pause_on_start, | 103 return _spawnSkyProcess(pause_on_start, pause_on_exit, |
| 103 pause_on_exit, | 104 pause_on_unhandled_exceptions, testeeControlsServer, extraArgs); |
| 104 pause_on_unhandled_exceptions, | |
| 105 testeeControlsServer, | |
| 106 extraArgs); | |
| 107 } else { | 105 } else { |
| 108 return _spawnDartProcess(pause_on_start, | 106 return _spawnDartProcess( |
| 109 pause_on_exit, | 107 pause_on_start, |
| 110 pause_on_unhandled_exceptions, | 108 pause_on_exit, |
| 111 testeeControlsServer, | 109 pause_on_unhandled_exceptions, |
| 112 useAuthToken, | 110 testeeControlsServer, |
| 113 extraArgs); | 111 useAuthToken, |
| 112 extraArgs); |
| 114 } | 113 } |
| 115 } | 114 } |
| 116 | 115 |
| 117 Future<Process> _spawnDartProcess(bool pause_on_start, | 116 Future<Process> _spawnDartProcess( |
| 118 bool pause_on_exit, | 117 bool pause_on_start, |
| 119 bool pause_on_unhandled_exceptions, | 118 bool pause_on_exit, |
| 120 bool testeeControlsServer, | 119 bool pause_on_unhandled_exceptions, |
| 121 bool useAuthToken, | 120 bool testeeControlsServer, |
| 122 List<String> extraArgs) { | 121 bool useAuthToken, |
| 122 List<String> extraArgs) { |
| 123 assert(!_shouldLaunchSkyShell()); | 123 assert(!_shouldLaunchSkyShell()); |
| 124 | 124 |
| 125 String dartExecutable = Platform.executable; | 125 String dartExecutable = Platform.executable; |
| 126 | 126 |
| 127 var fullArgs = []; | 127 var fullArgs = []; |
| 128 if (pause_on_start) { | 128 if (pause_on_start) { |
| 129 fullArgs.add('--pause-isolates-on-start'); | 129 fullArgs.add('--pause-isolates-on-start'); |
| 130 } | 130 } |
| 131 if (pause_on_exit) { | 131 if (pause_on_exit) { |
| 132 fullArgs.add('--pause-isolates-on-exit'); | 132 fullArgs.add('--pause-isolates-on-exit'); |
| 133 } | 133 } |
| 134 if (pause_on_unhandled_exceptions) { | 134 if (pause_on_unhandled_exceptions) { |
| 135 fullArgs.add('--pause-isolates-on-unhandled-exceptions'); | 135 fullArgs.add('--pause-isolates-on-unhandled-exceptions'); |
| 136 } | 136 } |
| 137 if (extraArgs != null) { | 137 if (extraArgs != null) { |
| 138 fullArgs.addAll(extraArgs); | 138 fullArgs.addAll(extraArgs); |
| 139 } | 139 } |
| 140 | 140 |
| 141 fullArgs.addAll(Platform.executableArguments); | 141 fullArgs.addAll(Platform.executableArguments); |
| 142 if (!testeeControlsServer) { | 142 if (!testeeControlsServer) { |
| 143 fullArgs.add('--enable-vm-service:0'); | 143 fullArgs.add('--enable-vm-service:0'); |
| 144 } | 144 } |
| 145 fullArgs.addAll(args); | 145 fullArgs.addAll(args); |
| 146 | 146 |
| 147 return _spawnCommon( | 147 return _spawnCommon(dartExecutable, fullArgs, |
| 148 dartExecutable, | 148 <String, String>{'DART_SERVICE_USE_AUTH': '$useAuthToken'}); |
| 149 fullArgs, | |
| 150 <String, String>{ | |
| 151 'DART_SERVICE_USE_AUTH': '$useAuthToken' | |
| 152 }); | |
| 153 } | 149 } |
| 154 | 150 |
| 155 Future<Process> _spawnSkyProcess(bool pause_on_start, | 151 Future<Process> _spawnSkyProcess( |
| 156 bool pause_on_exit, | 152 bool pause_on_start, |
| 157 bool pause_on_unhandled_exceptions, | 153 bool pause_on_exit, |
| 158 bool testeeControlsServer, | 154 bool pause_on_unhandled_exceptions, |
| 159 List<String> extraArgs) { | 155 bool testeeControlsServer, |
| 156 List<String> extraArgs) { |
| 160 assert(_shouldLaunchSkyShell()); | 157 assert(_shouldLaunchSkyShell()); |
| 161 | 158 |
| 162 String dartExecutable = _skyShellPath(); | 159 String dartExecutable = _skyShellPath(); |
| 163 | 160 |
| 164 var dartFlags = []; | 161 var dartFlags = []; |
| 165 var fullArgs = []; | 162 var fullArgs = []; |
| 166 if (pause_on_start) { | 163 if (pause_on_start) { |
| 167 dartFlags.add('--pause_isolates_on_start'); | 164 dartFlags.add('--pause_isolates_on_start'); |
| 168 fullArgs.add('--start-paused'); | 165 fullArgs.add('--start-paused'); |
| 169 } | 166 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 182 fullArgs.addAll(Platform.executableArguments); | 179 fullArgs.addAll(Platform.executableArguments); |
| 183 if (!testeeControlsServer) { | 180 if (!testeeControlsServer) { |
| 184 fullArgs.add('--observatory-port=0'); | 181 fullArgs.add('--observatory-port=0'); |
| 185 } | 182 } |
| 186 fullArgs.add('--dart-flags=${dartFlags.join(' ')}'); | 183 fullArgs.add('--dart-flags=${dartFlags.join(' ')}'); |
| 187 fullArgs.addAll(args); | 184 fullArgs.addAll(args); |
| 188 | 185 |
| 189 return _spawnCommon(dartExecutable, fullArgs, <String, String>{}); | 186 return _spawnCommon(dartExecutable, fullArgs, <String, String>{}); |
| 190 } | 187 } |
| 191 | 188 |
| 192 Future<Process> _spawnCommon(String executable, | 189 Future<Process> _spawnCommon(String executable, List<String> arguments, |
| 193 List<String> arguments, | 190 Map<String, String> dartEnvironment) { |
| 194 Map<String, String> dartEnvironment) { | |
| 195 var environment = _TESTEE_SPAWN_ENV; | 191 var environment = _TESTEE_SPAWN_ENV; |
| 196 var bashEnvironment = new StringBuffer(); | 192 var bashEnvironment = new StringBuffer(); |
| 197 environment.forEach((k, v) => bashEnvironment.write("$k=$v ")); | 193 environment.forEach((k, v) => bashEnvironment.write("$k=$v ")); |
| 198 if (dartEnvironment != null) { | 194 if (dartEnvironment != null) { |
| 199 dartEnvironment.forEach((k, v) { | 195 dartEnvironment.forEach((k, v) { |
| 200 arguments.insert(0, '-D$k=$v'); | 196 arguments.insert(0, '-D$k=$v'); |
| 201 }); | 197 }); |
| 202 } | 198 } |
| 203 print('** Launching $bashEnvironment$executable ${arguments.join(' ')}'); | 199 print('** Launching $bashEnvironment$executable ${arguments.join(' ')}'); |
| 204 return Process.start(executable, arguments, environment: environment); | 200 return Process.start(executable, arguments, environment: environment); |
| 205 } | 201 } |
| 206 | 202 |
| 207 Future<Uri> launch(bool pause_on_start, | 203 Future<Uri> launch( |
| 208 bool pause_on_exit, | 204 bool pause_on_start, |
| 209 bool pause_on_unhandled_exceptions, | 205 bool pause_on_exit, |
| 210 bool testeeControlsServer, | 206 bool pause_on_unhandled_exceptions, |
| 211 bool useAuthToken, | 207 bool testeeControlsServer, |
| 212 List<String> extraArgs) { | 208 bool useAuthToken, |
| 213 return _spawnProcess(pause_on_start, | 209 List<String> extraArgs) { |
| 214 pause_on_exit, | 210 return _spawnProcess( |
| 215 pause_on_unhandled_exceptions, | 211 pause_on_start, |
| 216 testeeControlsServer, | 212 pause_on_exit, |
| 217 useAuthToken, | 213 pause_on_unhandled_exceptions, |
| 218 extraArgs).then((p) { | 214 testeeControlsServer, |
| 215 useAuthToken, |
| 216 extraArgs).then((p) { |
| 219 Completer<Uri> completer = new Completer<Uri>(); | 217 Completer<Uri> completer = new Completer<Uri>(); |
| 220 process = p; | 218 process = p; |
| 221 Uri uri; | 219 Uri uri; |
| 222 var blank; | 220 var blank; |
| 223 var first = true; | 221 var first = true; |
| 224 process.stdout.transform(UTF8.decoder) | 222 process.stdout |
| 225 .transform(new LineSplitter()).listen((line) { | 223 .transform(UTF8.decoder) |
| 224 .transform(new LineSplitter()) |
| 225 .listen((line) { |
| 226 const kObservatoryListening = 'Observatory listening on '; | 226 const kObservatoryListening = 'Observatory listening on '; |
| 227 if (line.startsWith(kObservatoryListening)) { | 227 if (line.startsWith(kObservatoryListening)) { |
| 228 uri = Uri.parse(line.substring(kObservatoryListening.length)); | 228 uri = Uri.parse(line.substring(kObservatoryListening.length)); |
| 229 } | 229 } |
| 230 if (pause_on_start || line == '') { | 230 if (pause_on_start || line == '') { |
| 231 // Received blank line. | 231 // Received blank line. |
| 232 blank = true; | 232 blank = true; |
| 233 } | 233 } |
| 234 if ((uri != null) && (blank == true) && (first == true)) { | 234 if ((uri != null) && (blank == true) && (first == true)) { |
| 235 completer.complete(uri); | 235 completer.complete(uri); |
| 236 // Stop repeat completions. | 236 // Stop repeat completions. |
| 237 first = false; | 237 first = false; |
| 238 print('** Signaled to run test queries on $uri'); | 238 print('** Signaled to run test queries on $uri'); |
| 239 } | 239 } |
| 240 print('>testee>out> $line'); | 240 print('>testee>out> $line'); |
| 241 }); | 241 }); |
| 242 process.stderr.transform(UTF8.decoder) | 242 process.stderr |
| 243 .transform(new LineSplitter()).listen((line) { | 243 .transform(UTF8.decoder) |
| 244 .transform(new LineSplitter()) |
| 245 .listen((line) { |
| 244 print('>testee>err> $line'); | 246 print('>testee>err> $line'); |
| 245 }); | 247 }); |
| 246 process.exitCode.then((exitCode) { | 248 process.exitCode.then((exitCode) { |
| 247 if ((exitCode != 0) && !killedByTester) { | 249 if ((exitCode != 0) && !killedByTester) { |
| 248 throw "Testee exited with $exitCode"; | 250 throw "Testee exited with $exitCode"; |
| 249 } | 251 } |
| 250 print("** Process exited"); | 252 print("** Process exited"); |
| 251 }); | 253 }); |
| 252 return completer.future; | 254 return completer.future; |
| 253 }); | 255 }); |
| 254 } | 256 } |
| 255 | 257 |
| 256 void requestExit() { | 258 void requestExit() { |
| 257 print('** Killing script'); | 259 print('** Killing script'); |
| 258 if (process.kill()) { | 260 if (process.kill()) { |
| 259 killedByTester = true; | 261 killedByTester = true; |
| 260 } | 262 } |
| 261 } | 263 } |
| 262 } | 264 } |
| 263 | 265 |
| 264 void setupAddresses(Uri serverAddress) { | 266 void setupAddresses(Uri serverAddress) { |
| 265 serviceWebsocketAddress = | 267 serviceWebsocketAddress = |
| 266 'ws://${serverAddress.authority}${serverAddress.path}ws'; | 268 'ws://${serverAddress.authority}${serverAddress.path}ws'; |
| 267 serviceHttpAddress = | 269 serviceHttpAddress = 'http://${serverAddress.authority}${serverAddress.path}'; |
| 268 'http://${serverAddress.authority}${serverAddress.path}'; | |
| 269 } | 270 } |
| 270 | 271 |
| 271 class _ServiceTesterRunner { | 272 class _ServiceTesterRunner { |
| 272 void run({List<String> mainArgs, | 273 void run( |
| 273 List<String> extraArgs, | 274 {List<String> mainArgs, |
| 274 List<VMTest> vmTests, | 275 List<String> extraArgs, |
| 275 List<IsolateTest> isolateTests, | 276 List<VMTest> vmTests, |
| 276 bool pause_on_start: false, | 277 List<IsolateTest> isolateTests, |
| 277 bool pause_on_exit: false, | 278 bool pause_on_start: false, |
| 278 bool verbose_vm: false, | 279 bool pause_on_exit: false, |
| 279 bool pause_on_unhandled_exceptions: false, | 280 bool verbose_vm: false, |
| 280 bool testeeControlsServer: false, | 281 bool pause_on_unhandled_exceptions: false, |
| 281 bool useAuthToken: false}) { | 282 bool testeeControlsServer: false, |
| 283 bool useAuthToken: false}) { |
| 282 var process = new _ServiceTesteeLauncher(); | 284 var process = new _ServiceTesteeLauncher(); |
| 283 bool testsDone = false; | 285 bool testsDone = false; |
| 284 runZoned(() { | 286 runZoned(() { |
| 285 process.launch(pause_on_start, pause_on_exit, | 287 process |
| 286 pause_on_unhandled_exceptions, | 288 .launch(pause_on_start, pause_on_exit, pause_on_unhandled_exceptions, |
| 287 testeeControlsServer, | 289 testeeControlsServer, useAuthToken, extraArgs) |
| 288 useAuthToken, extraArgs).then((Uri serverAddress) async { | 290 .then((Uri serverAddress) async { |
| 289 if (mainArgs.contains("--gdb")) { | 291 if (mainArgs.contains("--gdb")) { |
| 290 var pid = process.process.pid; | 292 var pid = process.process.pid; |
| 291 var wait = new Duration(seconds: 10); | 293 var wait = new Duration(seconds: 10); |
| 292 print("Testee has pid $pid, waiting $wait before continuing"); | 294 print("Testee has pid $pid, waiting $wait before continuing"); |
| 293 sleep(wait); | 295 sleep(wait); |
| 294 } | 296 } |
| 295 setupAddresses(serverAddress); | 297 setupAddresses(serverAddress); |
| 296 var name = Platform.script.pathSegments.last; | 298 var name = Platform.script.pathSegments.last; |
| 297 var vm = | 299 var vm = |
| 298 new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress)); | 300 new WebSocketVM(new WebSocketVMTarget(serviceWebsocketAddress)); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 325 } | 327 } |
| 326 } | 328 } |
| 327 | 329 |
| 328 print('All service tests completed successfully.'); | 330 print('All service tests completed successfully.'); |
| 329 testsDone = true; | 331 testsDone = true; |
| 330 await process.requestExit(); | 332 await process.requestExit(); |
| 331 }); | 333 }); |
| 332 }, onError: (error, stackTrace) async { | 334 }, onError: (error, stackTrace) async { |
| 333 if (testsDone) { | 335 if (testsDone) { |
| 334 print('Ignoring late exception during process exit:\n' | 336 print('Ignoring late exception during process exit:\n' |
| 335 '$error\n#stackTrace'); | 337 '$error\n#stackTrace'); |
| 336 } else { | 338 } else { |
| 337 await process.requestExit(); | 339 await process.requestExit(); |
| 338 print('Unexpected exception in service tests: $error\n$stackTrace'); | 340 print('Unexpected exception in service tests: $error\n$stackTrace'); |
| 339 throw error; | 341 throw error; |
| 340 } | 342 } |
| 341 }); | 343 }); |
| 342 } | 344 } |
| 343 | 345 |
| 344 Future<Isolate> getFirstIsolate(WebSocketVM vm) async { | 346 Future<Isolate> getFirstIsolate(WebSocketVM vm) async { |
| 345 if (vm.isolates.isNotEmpty) { | 347 if (vm.isolates.isNotEmpty) { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 381 }); | 383 }); |
| 382 } | 384 } |
| 383 return await completer.future; | 385 return await completer.future; |
| 384 } | 386 } |
| 385 } | 387 } |
| 386 | 388 |
| 387 /// Runs [tests] in sequence, each of which should take an [Isolate] and | 389 /// Runs [tests] in sequence, each of which should take an [Isolate] and |
| 388 /// return a [Future]. Code for setting up state can run before and/or | 390 /// return a [Future]. Code for setting up state can run before and/or |
| 389 /// concurrently with the tests. Uses [mainArgs] to determine whether | 391 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 390 /// to run tests or testee in this invokation of the script. | 392 /// to run tests or testee in this invokation of the script. |
| 391 Future runIsolateTests(List<String> mainArgs, | 393 Future runIsolateTests(List<String> mainArgs, List<IsolateTest> tests, |
| 392 List<IsolateTest> tests, | 394 {testeeBefore(), |
| 393 {testeeBefore(), | 395 testeeConcurrent(), |
| 394 testeeConcurrent(), | 396 bool pause_on_start: false, |
| 395 bool pause_on_start: false, | 397 bool pause_on_exit: false, |
| 396 bool pause_on_exit: false, | 398 bool verbose_vm: false, |
| 397 bool verbose_vm: false, | 399 bool pause_on_unhandled_exceptions: false, |
| 398 bool pause_on_unhandled_exceptions: false, | 400 bool testeeControlsServer: false, |
| 399 bool testeeControlsServer: false, | 401 bool useAuthToken: false, |
| 400 bool useAuthToken: false, | 402 List<String> extraArgs}) async { |
| 401 List<String> extraArgs}) async { | |
| 402 assert(!pause_on_start || testeeBefore == null); | 403 assert(!pause_on_start || testeeBefore == null); |
| 403 if (_isTestee()) { | 404 if (_isTestee()) { |
| 404 new _ServiceTesteeRunner().run(testeeBefore: testeeBefore, | 405 new _ServiceTesteeRunner().run( |
| 405 testeeConcurrent: testeeConcurrent, | 406 testeeBefore: testeeBefore, |
| 406 pause_on_start: pause_on_start, | 407 testeeConcurrent: testeeConcurrent, |
| 407 pause_on_exit: pause_on_exit); | 408 pause_on_start: pause_on_start, |
| 409 pause_on_exit: pause_on_exit); |
| 408 } else { | 410 } else { |
| 409 new _ServiceTesterRunner().run( | 411 new _ServiceTesterRunner().run( |
| 410 mainArgs: mainArgs, | 412 mainArgs: mainArgs, |
| 411 extraArgs: extraArgs, | 413 extraArgs: extraArgs, |
| 412 isolateTests: tests, | 414 isolateTests: tests, |
| 413 pause_on_start: pause_on_start, | 415 pause_on_start: pause_on_start, |
| 414 pause_on_exit: pause_on_exit, | 416 pause_on_exit: pause_on_exit, |
| 415 verbose_vm: verbose_vm, | 417 verbose_vm: verbose_vm, |
| 416 pause_on_unhandled_exceptions: pause_on_unhandled_exceptions, | 418 pause_on_unhandled_exceptions: pause_on_unhandled_exceptions, |
| 417 testeeControlsServer: testeeControlsServer, | 419 testeeControlsServer: testeeControlsServer, |
| 418 useAuthToken: useAuthToken); | 420 useAuthToken: useAuthToken); |
| 419 } | 421 } |
| 420 } | 422 } |
| 421 | 423 |
| 422 /// Runs [tests] in sequence, each of which should take an [Isolate] and | 424 /// Runs [tests] in sequence, each of which should take an [Isolate] and |
| 423 /// return a [Future]. Code for setting up state can run before and/or | 425 /// return a [Future]. Code for setting up state can run before and/or |
| 424 /// concurrently with the tests. Uses [mainArgs] to determine whether | 426 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 425 /// to run tests or testee in this invokation of the script. | 427 /// to run tests or testee in this invokation of the script. |
| 426 /// | 428 /// |
| 427 /// This is a special version of this test harness specifically for the | 429 /// This is a special version of this test harness specifically for the |
| 428 /// pause_on_unhandled_exceptions_test, which cannot properly function | 430 /// pause_on_unhandled_exceptions_test, which cannot properly function |
| 429 /// in an async context (because exceptions are *always* handled in async | 431 /// in an async context (because exceptions are *always* handled in async |
| 430 /// functions). | 432 /// functions). |
| 431 void runIsolateTestsSynchronous(List<String> mainArgs, | 433 void runIsolateTestsSynchronous(List<String> mainArgs, List<IsolateTest> tests, |
| 432 List<IsolateTest> tests, | 434 {void testeeBefore(), |
| 433 {void testeeBefore(), | 435 void testeeConcurrent(), |
| 434 void testeeConcurrent(), | 436 bool pause_on_start: false, |
| 435 bool pause_on_start: false, | 437 bool pause_on_exit: false, |
| 436 bool pause_on_exit: false, | 438 bool verbose_vm: false, |
| 437 bool verbose_vm: false, | 439 bool pause_on_unhandled_exceptions: false, |
| 438 bool pause_on_unhandled_exceptions: false, | 440 List<String> extraArgs}) { |
| 439 List<String> extraArgs}) { | |
| 440 assert(!pause_on_start || testeeBefore == null); | 441 assert(!pause_on_start || testeeBefore == null); |
| 441 if (_isTestee()) { | 442 if (_isTestee()) { |
| 442 new _ServiceTesteeRunner().runSync(testeeBeforeSync: testeeBefore, | 443 new _ServiceTesteeRunner().runSync( |
| 443 testeeConcurrentSync: testeeConcurrent, | 444 testeeBeforeSync: testeeBefore, |
| 444 pause_on_start: pause_on_start, | 445 testeeConcurrentSync: testeeConcurrent, |
| 445 pause_on_exit: pause_on_exit); | 446 pause_on_start: pause_on_start, |
| 447 pause_on_exit: pause_on_exit); |
| 446 } else { | 448 } else { |
| 447 new _ServiceTesterRunner().run( | 449 new _ServiceTesterRunner().run( |
| 448 mainArgs: mainArgs, | 450 mainArgs: mainArgs, |
| 449 extraArgs: extraArgs, | 451 extraArgs: extraArgs, |
| 450 isolateTests: tests, | 452 isolateTests: tests, |
| 451 pause_on_start: pause_on_start, | 453 pause_on_start: pause_on_start, |
| 452 pause_on_exit: pause_on_exit, | 454 pause_on_exit: pause_on_exit, |
| 453 verbose_vm: verbose_vm, | 455 verbose_vm: verbose_vm, |
| 454 pause_on_unhandled_exceptions: pause_on_unhandled_exceptions); | 456 pause_on_unhandled_exceptions: pause_on_unhandled_exceptions); |
| 455 } | 457 } |
| 456 } | 458 } |
| 457 | 459 |
| 458 | |
| 459 /// Runs [tests] in sequence, each of which should take an [Isolate] and | 460 /// Runs [tests] in sequence, each of which should take an [Isolate] and |
| 460 /// return a [Future]. Code for setting up state can run before and/or | 461 /// return a [Future]. Code for setting up state can run before and/or |
| 461 /// concurrently with the tests. Uses [mainArgs] to determine whether | 462 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 462 /// to run tests or testee in this invokation of the script. | 463 /// to run tests or testee in this invokation of the script. |
| 463 Future runVMTests(List<String> mainArgs, | 464 Future runVMTests(List<String> mainArgs, List<VMTest> tests, |
| 464 List<VMTest> tests, | 465 {testeeBefore(), |
| 465 {testeeBefore(), | 466 testeeConcurrent(), |
| 466 testeeConcurrent(), | 467 bool pause_on_start: false, |
| 467 bool pause_on_start: false, | 468 bool pause_on_exit: false, |
| 468 bool pause_on_exit: false, | 469 bool verbose_vm: false, |
| 469 bool verbose_vm: false, | 470 bool pause_on_unhandled_exceptions: false, |
| 470 bool pause_on_unhandled_exceptions: false, | 471 List<String> extraArgs}) async { |
| 471 List<String> extraArgs}) async { | |
| 472 if (_isTestee()) { | 472 if (_isTestee()) { |
| 473 new _ServiceTesteeRunner().run(testeeBefore: testeeBefore, | 473 new _ServiceTesteeRunner().run( |
| 474 testeeConcurrent: testeeConcurrent, | 474 testeeBefore: testeeBefore, |
| 475 pause_on_start: pause_on_start, | 475 testeeConcurrent: testeeConcurrent, |
| 476 pause_on_exit: pause_on_exit); | 476 pause_on_start: pause_on_start, |
| 477 pause_on_exit: pause_on_exit); |
| 477 } else { | 478 } else { |
| 478 new _ServiceTesterRunner().run( | 479 new _ServiceTesterRunner().run( |
| 479 mainArgs: mainArgs, | 480 mainArgs: mainArgs, |
| 480 extraArgs: extraArgs, | 481 extraArgs: extraArgs, |
| 481 vmTests: tests, | 482 vmTests: tests, |
| 482 pause_on_start: pause_on_start, | 483 pause_on_start: pause_on_start, |
| 483 pause_on_exit: pause_on_exit, | 484 pause_on_exit: pause_on_exit, |
| 484 verbose_vm: verbose_vm, | 485 verbose_vm: verbose_vm, |
| 485 pause_on_unhandled_exceptions: pause_on_unhandled_exceptions); | 486 pause_on_unhandled_exceptions: pause_on_unhandled_exceptions); |
| 486 } | 487 } |
| 487 } | 488 } |
| OLD | NEW |