| 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'; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 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, | 29 Future<int> launch(bool pause_on_start, |
| 30 bool pause_on_exit, | 30 bool pause_on_exit, |
| 31 bool pause_on_unhandled_exceptions, | 31 bool pause_on_unhandled_exceptions, |
| 32 bool trace_service) { | 32 bool trace_service, |
| 33 bool trace_compiler) { |
| 33 assert(pause_on_start != null); | 34 assert(pause_on_start != null); |
| 34 assert(pause_on_exit != null); | 35 assert(pause_on_exit != null); |
| 35 assert(trace_service != null); | 36 assert(trace_service != null); |
| 36 // TODO(turnidge): I have temporarily turned on service tracing for | 37 // TODO(turnidge): I have temporarily turned on service tracing for |
| 37 // all tests to help diagnose flaky tests. | 38 // all tests to help diagnose flaky tests. |
| 38 trace_service = true; | 39 trace_service = true; |
| 39 String dartExecutable = Platform.executable; | 40 String dartExecutable = Platform.executable; |
| 40 var fullArgs = []; | 41 var fullArgs = []; |
| 41 if (trace_service) { | 42 if (trace_service) { |
| 42 fullArgs.add('--trace-service'); | 43 fullArgs.add('--trace-service'); |
| 43 } | 44 } |
| 45 if (trace_compiler) { |
| 46 fullArgs.add('--trace-compiler'); |
| 47 } |
| 44 if (pause_on_start) { | 48 if (pause_on_start) { |
| 45 fullArgs.add('--pause-isolates-on-start'); | 49 fullArgs.add('--pause-isolates-on-start'); |
| 46 } | 50 } |
| 47 if (pause_on_exit) { | 51 if (pause_on_exit) { |
| 48 fullArgs.add('--pause-isolates-on-exit'); | 52 fullArgs.add('--pause-isolates-on-exit'); |
| 49 } | 53 } |
| 50 if (pause_on_unhandled_exceptions) { | 54 if (pause_on_unhandled_exceptions) { |
| 51 fullArgs.add('--pause-isolates-on-unhandled-exceptions'); | 55 fullArgs.add('--pause-isolates-on-unhandled-exceptions'); |
| 52 } | 56 } |
| 53 fullArgs.addAll(Platform.executableArguments); | 57 fullArgs.addAll(Platform.executableArguments); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 /// return a [Future]. Code for setting up state can run before and/or | 116 /// return a [Future]. Code for setting up state can run before and/or |
| 113 /// concurrently with the tests. Uses [mainArgs] to determine whether | 117 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 114 /// to run tests or testee in this invokation of the script. | 118 /// to run tests or testee in this invokation of the script. |
| 115 Future runIsolateTests(List<String> mainArgs, | 119 Future runIsolateTests(List<String> mainArgs, |
| 116 List<IsolateTest> tests, | 120 List<IsolateTest> tests, |
| 117 {testeeBefore(), | 121 {testeeBefore(), |
| 118 void testeeConcurrent(), | 122 void testeeConcurrent(), |
| 119 bool pause_on_start: false, | 123 bool pause_on_start: false, |
| 120 bool pause_on_exit: false, | 124 bool pause_on_exit: false, |
| 121 bool trace_service: false, | 125 bool trace_service: false, |
| 126 bool trace_compiler: false, |
| 122 bool verbose_vm: false, | 127 bool verbose_vm: false, |
| 123 bool pause_on_unhandled_exceptions: false}) async { | 128 bool pause_on_unhandled_exceptions: false}) async { |
| 124 assert(!pause_on_start || testeeBefore == null); | 129 assert(!pause_on_start || testeeBefore == null); |
| 125 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { | 130 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { |
| 126 if (!pause_on_start) { | 131 if (!pause_on_start) { |
| 127 if (testeeBefore != null) { | 132 if (testeeBefore != null) { |
| 128 var result = testeeBefore(); | 133 var result = testeeBefore(); |
| 129 if (result is Future) { | 134 if (result is Future) { |
| 130 await result; | 135 await result; |
| 131 } | 136 } |
| 132 } | 137 } |
| 133 print(''); // Print blank line to signal that we are ready. | 138 print(''); // Print blank line to signal that we are ready. |
| 134 } | 139 } |
| 135 if (testeeConcurrent != null) { | 140 if (testeeConcurrent != null) { |
| 136 testeeConcurrent(); | 141 testeeConcurrent(); |
| 137 } | 142 } |
| 138 if (!pause_on_exit) { | 143 if (!pause_on_exit) { |
| 139 // Wait around for the process to be killed. | 144 // Wait around for the process to be killed. |
| 140 stdin.first.then((_) => exit(0)); | 145 stdin.first.then((_) => exit(0)); |
| 141 } | 146 } |
| 142 } else { | 147 } else { |
| 143 var process = new _TestLauncher(); | 148 var process = new _TestLauncher(); |
| 144 process.launch(pause_on_start, pause_on_exit, | 149 process.launch(pause_on_start, pause_on_exit, |
| 145 pause_on_unhandled_exceptions, trace_service).then((port) { | 150 pause_on_unhandled_exceptions, |
| 151 trace_service, trace_compiler).then((port) { |
| 146 if (mainArgs.contains("--gdb")) { | 152 if (mainArgs.contains("--gdb")) { |
| 147 port = 8181; | 153 port = 8181; |
| 148 } | 154 } |
| 149 String addr = 'ws://localhost:$port/ws'; | 155 String addr = 'ws://localhost:$port/ws'; |
| 150 serviceHttpAddress = 'http://localhost:$port'; | 156 serviceHttpAddress = 'http://localhost:$port'; |
| 151 var testIndex = 1; | 157 var testIndex = 1; |
| 152 var totalTests = tests.length; | 158 var totalTests = tests.length; |
| 153 var name = Platform.script.pathSegments.last; | 159 var name = Platform.script.pathSegments.last; |
| 154 runZoned(() { | 160 runZoned(() { |
| 155 new WebSocketVM(new WebSocketVMTarget(addr)).load() | 161 new WebSocketVM(new WebSocketVMTarget(addr)).load() |
| (...skipping 27 matching lines...) Expand all Loading... |
| 183 /// | 189 /// |
| 184 /// TODO(johnmccutchan): Don't use the shared harness for the | 190 /// TODO(johnmccutchan): Don't use the shared harness for the |
| 185 /// pause_on_unhandled_exceptions_test. | 191 /// pause_on_unhandled_exceptions_test. |
| 186 void runIsolateTestsSynchronous(List<String> mainArgs, | 192 void runIsolateTestsSynchronous(List<String> mainArgs, |
| 187 List<IsolateTest> tests, | 193 List<IsolateTest> tests, |
| 188 {void testeeBefore(), | 194 {void testeeBefore(), |
| 189 void testeeConcurrent(), | 195 void testeeConcurrent(), |
| 190 bool pause_on_start: false, | 196 bool pause_on_start: false, |
| 191 bool pause_on_exit: false, | 197 bool pause_on_exit: false, |
| 192 bool trace_service: false, | 198 bool trace_service: false, |
| 199 bool trace_compiler: false, |
| 193 bool verbose_vm: false, | 200 bool verbose_vm: false, |
| 194 bool pause_on_unhandled_exceptions: false}) { | 201 bool pause_on_unhandled_exceptions: false}) { |
| 195 assert(!pause_on_start || testeeBefore == null); | 202 assert(!pause_on_start || testeeBefore == null); |
| 196 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { | 203 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { |
| 197 if (!pause_on_start) { | 204 if (!pause_on_start) { |
| 198 if (testeeBefore != null) { | 205 if (testeeBefore != null) { |
| 199 testeeBefore(); | 206 testeeBefore(); |
| 200 } | 207 } |
| 201 print(''); // Print blank line to signal that we are ready. | 208 print(''); // Print blank line to signal that we are ready. |
| 202 } | 209 } |
| 203 if (testeeConcurrent != null) { | 210 if (testeeConcurrent != null) { |
| 204 testeeConcurrent(); | 211 testeeConcurrent(); |
| 205 } | 212 } |
| 206 if (!pause_on_exit) { | 213 if (!pause_on_exit) { |
| 207 // Wait around for the process to be killed. | 214 // Wait around for the process to be killed. |
| 208 stdin.first.then((_) => exit(0)); | 215 stdin.first.then((_) => exit(0)); |
| 209 } | 216 } |
| 210 } else { | 217 } else { |
| 211 var process = new _TestLauncher(); | 218 var process = new _TestLauncher(); |
| 212 process.launch(pause_on_start, pause_on_exit, | 219 process.launch(pause_on_start, pause_on_exit, |
| 213 pause_on_unhandled_exceptions, trace_service).then((port) { | 220 pause_on_unhandled_exceptions, |
| 221 trace_service, trace_compiler).then((port) { |
| 214 if (mainArgs.contains("--gdb")) { | 222 if (mainArgs.contains("--gdb")) { |
| 215 port = 8181; | 223 port = 8181; |
| 216 } | 224 } |
| 217 String addr = 'ws://localhost:$port/ws'; | 225 String addr = 'ws://localhost:$port/ws'; |
| 218 serviceHttpAddress = 'http://localhost:$port'; | 226 serviceHttpAddress = 'http://localhost:$port'; |
| 219 var testIndex = 1; | 227 var testIndex = 1; |
| 220 var totalTests = tests.length; | 228 var totalTests = tests.length; |
| 221 var name = Platform.script.pathSegments.last; | 229 var name = Platform.script.pathSegments.last; |
| 222 runZoned(() { | 230 runZoned(() { |
| 223 new WebSocketVM(new WebSocketVMTarget(addr)).load() | 231 new WebSocketVM(new WebSocketVMTarget(addr)).load() |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 393 /// return a [Future]. Code for setting up state can run before and/or | 401 /// return a [Future]. Code for setting up state can run before and/or |
| 394 /// concurrently with the tests. Uses [mainArgs] to determine whether | 402 /// concurrently with the tests. Uses [mainArgs] to determine whether |
| 395 /// to run tests or testee in this invokation of the script. | 403 /// to run tests or testee in this invokation of the script. |
| 396 Future runVMTests(List<String> mainArgs, | 404 Future runVMTests(List<String> mainArgs, |
| 397 List<VMTest> tests, | 405 List<VMTest> tests, |
| 398 {Future testeeBefore(), | 406 {Future testeeBefore(), |
| 399 Future testeeConcurrent(), | 407 Future testeeConcurrent(), |
| 400 bool pause_on_start: false, | 408 bool pause_on_start: false, |
| 401 bool pause_on_exit: false, | 409 bool pause_on_exit: false, |
| 402 bool trace_service: false, | 410 bool trace_service: false, |
| 411 bool trace_compiler: false, |
| 403 bool verbose_vm: false, | 412 bool verbose_vm: false, |
| 404 bool pause_on_unhandled_exceptions: false}) async { | 413 bool pause_on_unhandled_exceptions: false}) async { |
| 405 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { | 414 if (mainArgs.contains(_TESTEE_MODE_FLAG)) { |
| 406 if (!pause_on_start) { | 415 if (!pause_on_start) { |
| 407 if (testeeBefore != null) { | 416 if (testeeBefore != null) { |
| 408 await testeeBefore(); | 417 await testeeBefore(); |
| 409 } | 418 } |
| 410 print(''); // Print blank line to signal that we are ready. | 419 print(''); // Print blank line to signal that we are ready. |
| 411 } | 420 } |
| 412 if (testeeConcurrent != null) { | 421 if (testeeConcurrent != null) { |
| 413 await testeeConcurrent(); | 422 await testeeConcurrent(); |
| 414 } | 423 } |
| 415 if (!pause_on_exit) { | 424 if (!pause_on_exit) { |
| 416 // Wait around for the process to be killed. | 425 // Wait around for the process to be killed. |
| 417 stdin.first.then((_) => exit(0)); | 426 stdin.first.then((_) => exit(0)); |
| 418 } | 427 } |
| 419 } else { | 428 } else { |
| 420 var process = new _TestLauncher(); | 429 var process = new _TestLauncher(); |
| 421 process.launch(pause_on_start, | 430 process.launch(pause_on_start, |
| 422 pause_on_exit, | 431 pause_on_exit, |
| 423 pause_on_unhandled_exceptions, | 432 pause_on_unhandled_exceptions, |
| 424 trace_service).then((port) async { | 433 trace_service, trace_compiler).then((port) async { |
| 425 if (mainArgs.contains("--gdb")) { | 434 if (mainArgs.contains("--gdb")) { |
| 426 port = 8181; | 435 port = 8181; |
| 427 } | 436 } |
| 428 String addr = 'ws://localhost:$port/ws'; | 437 String addr = 'ws://localhost:$port/ws'; |
| 429 serviceHttpAddress = 'http://localhost:$port'; | 438 serviceHttpAddress = 'http://localhost:$port'; |
| 430 var testIndex = 1; | 439 var testIndex = 1; |
| 431 var totalTests = tests.length; | 440 var totalTests = tests.length; |
| 432 var name = Platform.script.pathSegments.last; | 441 var name = Platform.script.pathSegments.last; |
| 433 runZoned(() { | 442 runZoned(() { |
| 434 new WebSocketVM(new WebSocketVMTarget(addr)).load() | 443 new WebSocketVM(new WebSocketVMTarget(addr)).load() |
| 435 .then((VM vm) => Future.forEach(tests, (test) { | 444 .then((VM vm) => Future.forEach(tests, (test) { |
| 436 vm.verbose = verbose_vm; | 445 vm.verbose = verbose_vm; |
| 437 print('Running $name [$testIndex/$totalTests]'); | 446 print('Running $name [$testIndex/$totalTests]'); |
| 438 testIndex++; | 447 testIndex++; |
| 439 return test(vm); | 448 return test(vm); |
| 440 })).then((_) => process.requestExit()); | 449 })).then((_) => process.requestExit()); |
| 441 }, onError: (e, st) { | 450 }, onError: (e, st) { |
| 442 process.requestExit(); | 451 process.requestExit(); |
| 443 if (!_isWebSocketDisconnect(e)) { | 452 if (!_isWebSocketDisconnect(e)) { |
| 444 print('Unexpected exception in service tests: $e $st'); | 453 print('Unexpected exception in service tests: $e $st'); |
| 445 throw e; | 454 throw e; |
| 446 } | 455 } |
| 447 }); | 456 }); |
| 448 }); | 457 }); |
| 449 } | 458 } |
| 450 } | 459 } |
| OLD | NEW |