| 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 'package:unittest/unittest.dart'; | 11 import 'package:unittest/unittest.dart'; |
| 12 | 12 |
| 13 bool _isWebSocketDisconnect(e) { | 13 bool _isWebSocketDisconnect(e) { |
| 14 return e is NetworkRpcException; | 14 return e is NetworkRpcException; |
| 15 } | 15 } |
| 16 | 16 |
| 17 // This invocation should set up the state being tested. | 17 // This invocation should set up the state being tested. |
| 18 const String _TESTEE_MODE_FLAG = "--testee-mode"; | 18 const String _TESTEE_MODE_FLAG = "--testee-mode"; |
| 19 | 19 |
| 20 class _TestLauncher { | 20 class _TestLauncher { |
| 21 Process process; | 21 Process process; |
| 22 final List<String> args; | 22 final List<String> args; |
| 23 bool killedByTester = false; | 23 bool killedByTester = false; |
| 24 | 24 |
| 25 _TestLauncher() : args = ['--enable-vm-service:0', | 25 _TestLauncher() : args = ['--enable-vm-service:0', |
| 26 Platform.script.toFilePath(), | 26 Platform.script.toFilePath(), |
| 27 _TESTEE_MODE_FLAG] {} | 27 _TESTEE_MODE_FLAG] {} |
| 28 | 28 |
| 29 Future<int> launch(bool pause_on_start, bool pause_on_exit) { | 29 Future<int> launch(bool pause_on_start, bool pause_on_exit, bool trace_service
) { |
| 30 assert(pause_on_start != null); |
| 31 assert(pause_on_exit != null); |
| 32 assert(trace_service != null); |
| 30 String dartExecutable = Platform.executable; | 33 String dartExecutable = Platform.executable; |
| 31 var fullArgs = []; | 34 var fullArgs = []; |
| 32 if (pause_on_start == true) { | 35 if (trace_service) { |
| 36 fullArgs.add('--trace-service'); |
| 37 } |
| 38 if (pause_on_start) { |
| 33 fullArgs.add('--pause-isolates-on-start'); | 39 fullArgs.add('--pause-isolates-on-start'); |
| 34 } | 40 } |
| 35 if (pause_on_exit == true) { | 41 if (pause_on_exit) { |
| 36 fullArgs.add('--pause-isolates-on-exit'); | 42 fullArgs.add('--pause-isolates-on-exit'); |
| 37 } | 43 } |
| 38 fullArgs.addAll(Platform.executableArguments); | 44 fullArgs.addAll(Platform.executableArguments); |
| 39 fullArgs.addAll(args); | 45 fullArgs.addAll(args); |
| 40 print('** Launching $dartExecutable ${fullArgs.join(' ')}'); | 46 print('** Launching $dartExecutable ${fullArgs.join(' ')}'); |
| 41 return Process.start(dartExecutable, fullArgs).then((p) { | 47 return Process.start(dartExecutable, fullArgs).then((p) { |
| 42 | 48 |
| 43 Completer completer = new Completer(); | 49 Completer completer = new Completer(); |
| 44 process = p; | 50 process = p; |
| 45 var portNumber; | 51 var portNumber; |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 95 | 101 |
| 96 /// Runs [tests] in sequence, each of which should take an [Isolate] and | 102 /// Runs [tests] in sequence, each of which should take an [Isolate] and |
| 97 /// return a [Future]. Code for setting up state can run before and/or | 103 /// return a [Future]. Code for setting up state can run before and/or |
| 98 /// concurrently with the tests. Uses [mainArgs] to determine whether | 104 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 99 /// to run tests or testee in this invokation of the script. | 105 /// to run tests or testee in this invokation of the script. |
| 100 void runIsolateTests(List<String> mainArgs, | 106 void runIsolateTests(List<String> mainArgs, |
| 101 List<IsolateTest> tests, | 107 List<IsolateTest> tests, |
| 102 {void testeeBefore(), | 108 {void testeeBefore(), |
| 103 void testeeConcurrent(), | 109 void testeeConcurrent(), |
| 104 bool pause_on_start: false, | 110 bool pause_on_start: false, |
| 105 bool pause_on_exit: false}) { | 111 bool pause_on_exit: false, |
| 112 bool trace_service: false}) { |
| 106 assert(!pause_on_start || testeeBefore == null); | 113 assert(!pause_on_start || testeeBefore == null); |
| 107 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { | 114 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { |
| 108 if (!pause_on_start) { | 115 if (!pause_on_start) { |
| 109 if (testeeBefore != null) { | 116 if (testeeBefore != null) { |
| 110 testeeBefore(); | 117 testeeBefore(); |
| 111 } | 118 } |
| 112 print(''); // Print blank line to signal that we are ready. | 119 print(''); // Print blank line to signal that we are ready. |
| 113 } | 120 } |
| 114 if (testeeConcurrent != null) { | 121 if (testeeConcurrent != null) { |
| 115 testeeConcurrent(); | 122 testeeConcurrent(); |
| 116 } | 123 } |
| 117 if (!pause_on_exit) { | 124 if (!pause_on_exit) { |
| 118 // Wait around for the process to be killed. | 125 // Wait around for the process to be killed. |
| 119 stdin.first.then((_) => exit(0)); | 126 stdin.first.then((_) => exit(0)); |
| 120 } | 127 } |
| 121 } else { | 128 } else { |
| 122 var process = new _TestLauncher(); | 129 var process = new _TestLauncher(); |
| 123 process.launch(pause_on_start, pause_on_exit).then((port) { | 130 process.launch(pause_on_start, pause_on_exit, trace_service).then((port) { |
| 124 if (mainArgs.contains("--gdb")) { | 131 if (mainArgs.contains("--gdb")) { |
| 125 port = 8181; | 132 port = 8181; |
| 126 } | 133 } |
| 127 String addr = 'ws://localhost:$port/ws'; | 134 String addr = 'ws://localhost:$port/ws'; |
| 128 serviceHttpAddress = 'http://localhost:$port'; | 135 serviceHttpAddress = 'http://localhost:$port'; |
| 129 var testIndex = 1; | 136 var testIndex = 1; |
| 130 var totalTests = tests.length; | 137 var totalTests = tests.length; |
| 131 var name = Platform.script.pathSegments.last; | 138 var name = Platform.script.pathSegments.last; |
| 132 runZoned(() { | 139 runZoned(() { |
| 133 new WebSocketVM(new WebSocketVMTarget(addr)).load() | 140 new WebSocketVM(new WebSocketVMTarget(addr)).load() |
| (...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 | 277 |
| 271 /// Runs [tests] in sequence, each of which should take an [Isolate] and | 278 /// Runs [tests] in sequence, each of which should take an [Isolate] and |
| 272 /// return a [Future]. Code for setting up state can run before and/or | 279 /// return a [Future]. Code for setting up state can run before and/or |
| 273 /// concurrently with the tests. Uses [mainArgs] to determine whether | 280 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 274 /// to run tests or testee in this invokation of the script. | 281 /// to run tests or testee in this invokation of the script. |
| 275 Future runVMTests(List<String> mainArgs, | 282 Future runVMTests(List<String> mainArgs, |
| 276 List<VMTest> tests, | 283 List<VMTest> tests, |
| 277 {Future testeeBefore(), | 284 {Future testeeBefore(), |
| 278 Future testeeConcurrent(), | 285 Future testeeConcurrent(), |
| 279 bool pause_on_start: false, | 286 bool pause_on_start: false, |
| 280 bool pause_on_exit: false}) async { | 287 bool pause_on_exit: false, |
| 288 bool trace_service: false}) async { |
| 281 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { | 289 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { |
| 282 if (!pause_on_start) { | 290 if (!pause_on_start) { |
| 283 if (testeeBefore != null) { | 291 if (testeeBefore != null) { |
| 284 await testeeBefore(); | 292 await testeeBefore(); |
| 285 } | 293 } |
| 286 print(''); // Print blank line to signal that we are ready. | 294 print(''); // Print blank line to signal that we are ready. |
| 287 } | 295 } |
| 288 if (testeeConcurrent != null) { | 296 if (testeeConcurrent != null) { |
| 289 await testeeConcurrent(); | 297 await testeeConcurrent(); |
| 290 } | 298 } |
| 291 if (!pause_on_exit) { | 299 if (!pause_on_exit) { |
| 292 // Wait around for the process to be killed. | 300 // Wait around for the process to be killed. |
| 293 stdin.first.then((_) => exit(0)); | 301 stdin.first.then((_) => exit(0)); |
| 294 } | 302 } |
| 295 } else { | 303 } else { |
| 296 var process = new _TestLauncher(); | 304 var process = new _TestLauncher(); |
| 297 process.launch(pause_on_start, pause_on_exit).then((port) async { | 305 process.launch(pause_on_start, |
| 306 pause_on_exit, |
| 307 trace_service).then((port) async { |
| 298 if (mainArgs.contains("--gdb")) { | 308 if (mainArgs.contains("--gdb")) { |
| 299 port = 8181; | 309 port = 8181; |
| 300 } | 310 } |
| 301 String addr = 'ws://localhost:$port/ws'; | 311 String addr = 'ws://localhost:$port/ws'; |
| 302 serviceHttpAddress = 'http://localhost:$port'; | 312 serviceHttpAddress = 'http://localhost:$port'; |
| 303 var testIndex = 1; | 313 var testIndex = 1; |
| 304 var totalTests = tests.length; | 314 var totalTests = tests.length; |
| 305 var name = Platform.script.pathSegments.last; | 315 var name = Platform.script.pathSegments.last; |
| 306 runZoned(() { | 316 runZoned(() { |
| 307 new WebSocketVM(new WebSocketVMTarget(addr)).load() | 317 new WebSocketVM(new WebSocketVMTarget(addr)).load() |
| 308 .then((VM vm) => Future.forEach(tests, (test) { | 318 .then((VM vm) => Future.forEach(tests, (test) { |
| 309 print('Running $name [$testIndex/$totalTests]'); | 319 print('Running $name [$testIndex/$totalTests]'); |
| 310 testIndex++; | 320 testIndex++; |
| 311 return test(vm); | 321 return test(vm); |
| 312 })).then((_) => process.requestExit()); | 322 })).then((_) => process.requestExit()); |
| 313 }, onError: (e, st) { | 323 }, onError: (e, st) { |
| 314 process.requestExit(); | 324 process.requestExit(); |
| 315 if (!_isWebSocketDisconnect(e)) { | 325 if (!_isWebSocketDisconnect(e)) { |
| 316 print('Unexpected exception in service tests: $e $st'); | 326 print('Unexpected exception in service tests: $e $st'); |
| 317 throw e; | 327 throw e; |
| 318 } | 328 } |
| 319 }); | 329 }); |
| 320 }); | 330 }); |
| 321 } | 331 } |
| 322 } | 332 } |
| OLD | NEW |