OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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.runner.browser.server; | 5 library test.runner.browser.server; |
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 | 10 |
(...skipping 413 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
424 var hostUrl = (_pubServeUrl == null ? url : _pubServeUrl) | 424 var hostUrl = (_pubServeUrl == null ? url : _pubServeUrl) |
425 .resolve('packages/test/src/runner/browser/static/index.html'); | 425 .resolve('packages/test/src/runner/browser/static/index.html'); |
426 | 426 |
427 var browser = _newBrowser(hostUrl.replace(queryParameters: { | 427 var browser = _newBrowser(hostUrl.replace(queryParameters: { |
428 'managerUrl': webSocketUrl.toString() | 428 'managerUrl': webSocketUrl.toString() |
429 }), platform); | 429 }), platform); |
430 _browsers[platform] = browser; | 430 _browsers[platform] = browser; |
431 | 431 |
432 // TODO(nweiz): Gracefully handle the browser being killed before the | 432 // TODO(nweiz): Gracefully handle the browser being killed before the |
433 // tests complete. | 433 // tests complete. |
434 browser.onExit.catchError((error, stackTrace) { | 434 browser.onExit.then((_) { |
| 435 if (completer.isCompleted) return; |
| 436 if (!_closed) return; |
| 437 completer.complete(null); |
| 438 }).catchError((error, stackTrace) { |
435 if (completer.isCompleted) return; | 439 if (completer.isCompleted) return; |
436 completer.completeError(error, stackTrace); | 440 completer.completeError(error, stackTrace); |
437 }); | 441 }); |
438 | 442 |
439 return completer.future.timeout(new Duration(seconds: 7), onTimeout: () { | 443 return completer.future.timeout(new Duration(seconds: 7), onTimeout: () { |
440 throw new ApplicationException( | 444 throw new ApplicationException( |
441 "Timed out waiting for ${platform.name} to connect."); | 445 "Timed out waiting for ${platform.name} to connect."); |
442 }); | 446 }); |
443 } | 447 } |
444 | 448 |
(...skipping 11 matching lines...) Expand all Loading... |
456 throw new ArgumentError("$browser is not a browser."); | 460 throw new ArgumentError("$browser is not a browser."); |
457 } | 461 } |
458 } | 462 } |
459 | 463 |
460 /// Closes the server and releases all its resources. | 464 /// Closes the server and releases all its resources. |
461 /// | 465 /// |
462 /// Returns a [Future] that completes once the server is closed and its | 466 /// Returns a [Future] that completes once the server is closed and its |
463 /// resources have been fully released. | 467 /// resources have been fully released. |
464 Future close() { | 468 Future close() { |
465 return _closeThunk.run(() async { | 469 return _closeThunk.run(() async { |
466 var futures = _browserManagers.keys.map((platform) async { | 470 var futures = _browsers.values.map((browser) => browser.close()).toList(); |
467 await _browserManagers[platform]; | |
468 await _browsers[platform].close(); | |
469 }).toList(); | |
470 | 471 |
471 futures.add(_server.close()); | 472 futures.add(_server.close()); |
472 futures.add(_compilers.close()); | 473 futures.add(_compilers.close()); |
473 | 474 |
474 await Future.wait(futures); | 475 await Future.wait(futures); |
475 | 476 |
476 if (_pubServeUrl == null) { | 477 if (_pubServeUrl == null) { |
477 new Directory(_compiledDir).deleteSync(recursive: true); | 478 new Directory(_compiledDir).deleteSync(recursive: true); |
478 } else { | 479 } else { |
479 _http.close(); | 480 _http.close(); |
480 } | 481 } |
481 }); | 482 }); |
482 } | 483 } |
483 } | 484 } |
OLD | NEW |