Index: lib/src/runner/browser/browser_manager.dart |
diff --git a/lib/src/runner/browser/browser_manager.dart b/lib/src/runner/browser/browser_manager.dart |
index 1b1f4c94609676893e86b4616b2a9af547863e8a..a6222bea183ba8e45b7c865c05b58a3443b9a35a 100644 |
--- a/lib/src/runner/browser/browser_manager.dart |
+++ b/lib/src/runner/browser/browser_manager.dart |
@@ -11,27 +11,23 @@ import 'package:async/async.dart'; |
import 'package:http_parser/http_parser.dart'; |
import 'package:pool/pool.dart'; |
-import '../../backend/group.dart'; |
import '../../backend/metadata.dart'; |
-import '../../backend/test.dart'; |
import '../../backend/test_platform.dart'; |
import '../../util/multi_channel.dart'; |
-import '../../util/remote_exception.dart'; |
import '../../util/stack_trace_mapper.dart'; |
import '../../utils.dart'; |
import '../application_exception.dart'; |
import '../environment.dart'; |
-import '../load_exception.dart'; |
import '../runner_suite.dart'; |
import 'browser.dart'; |
import 'chrome.dart'; |
import 'content_shell.dart'; |
import 'dartium.dart'; |
import 'firefox.dart'; |
-import 'iframe_test.dart'; |
import 'internet_explorer.dart'; |
import 'phantom_js.dart'; |
import 'safari.dart'; |
+import 'suite.dart'; |
/// A class that manages the connection to a single running browser. |
/// |
@@ -180,18 +176,16 @@ class BrowserManager { |
// prematurely (e.g. via Control-C). |
var suiteVirtualChannel = _channel.virtualChannel(); |
var suiteId = _suiteId++; |
- var suiteChannel; |
closeIframe() { |
if (_closed) return; |
- suiteChannel.sink.close(); |
_channel.sink.add({ |
"command": "closeSuite", |
"id": suiteId |
}); |
} |
- var response = await _pool.withResource(() { |
+ return await _pool.withResource(() async { |
_channel.sink.add({ |
"command": "loadSuite", |
"url": url.toString(), |
@@ -199,85 +193,15 @@ class BrowserManager { |
"channel": suiteVirtualChannel.id |
}); |
- // Create a nested MultiChannel because the iframe will be using a channel |
- // wrapped within the host's channel. |
- suiteChannel = new MultiChannel( |
- suiteVirtualChannel.stream, suiteVirtualChannel.sink); |
- |
- var completer = new Completer(); |
- suiteChannel.stream.listen((response) { |
- if (response["type"] == "print") { |
- print(response["line"]); |
- } else { |
- completer.complete(response); |
- } |
- }, onDone: () { |
- if (!completer.isCompleted) completer.complete(); |
- }); |
- |
- return completer.future.timeout(new Duration(minutes: 1), onTimeout: () { |
- throw new LoadException( |
- path, |
- "Timed out waiting for the test suite to connect on " |
- "${_platform.name}."); |
- }); |
- }); |
- |
- if (response == null) { |
- closeIframe(); |
- throw new LoadException( |
- path, "Connection closed before test suite loaded."); |
- } |
- |
- if (response["type"] == "loadException") { |
- closeIframe(); |
- throw new LoadException(path, response["message"]); |
- } |
- |
- if (response["type"] == "error") { |
- closeIframe(); |
- var asyncError = RemoteException.deserialize(response["error"]); |
- await new Future.error( |
- new LoadException(path, asyncError.error), |
- asyncError.stackTrace); |
- } |
- |
- return new RunnerSuite( |
- await _environment, |
- _deserializeGroup(suiteChannel, mapper, response["root"]), |
- platform: _platform, |
- path: path, |
- onClose: () => closeIframe()); |
- } |
- |
- /// Deserializes [group] into a concrete [Group] class. |
- Group _deserializeGroup(MultiChannel suiteChannel, |
- StackTraceMapper mapper, Map group) { |
- var metadata = new Metadata.deserialize(group['metadata']); |
- return new Group(group['name'], group['entries'].map((entry) { |
- if (entry['type'] == 'group') { |
- return _deserializeGroup(suiteChannel, mapper, entry); |
+ try { |
+ return await loadBrowserSuite( |
+ suiteVirtualChannel, await _environment, path, |
+ mapper: mapper, platform: _platform, onClose: () => closeIframe()); |
+ } catch (_) { |
+ closeIframe(); |
+ rethrow; |
} |
- |
- return _deserializeTest(suiteChannel, mapper, entry); |
- }), |
- metadata: metadata, |
- setUpAll: _deserializeTest(suiteChannel, mapper, group['setUpAll']), |
- tearDownAll: |
- _deserializeTest(suiteChannel, mapper, group['tearDownAll'])); |
- } |
- |
- /// Deserializes [test] into a concrete [Test] class. |
- /// |
- /// Returns `null` if [test] is `null`. |
- Test _deserializeTest(MultiChannel suiteChannel, StackTraceMapper mapper, |
- Map test) { |
- if (test == null) return null; |
- |
- var metadata = new Metadata.deserialize(test['metadata']); |
- var testChannel = suiteChannel.virtualChannel(test['channel']); |
- return new IframeTest(test['name'], metadata, testChannel, |
- mapper: mapper); |
+ }); |
} |
/// An implementation of [Environment.displayPause]. |