| Index: lib/src/runner/browser/suite.dart
|
| diff --git a/lib/src/runner/browser/suite.dart b/lib/src/runner/browser/suite.dart
|
| deleted file mode 100644
|
| index 0e8d3c3e71511faaaf55582dd9f122d6a3c724da..0000000000000000000000000000000000000000
|
| --- a/lib/src/runner/browser/suite.dart
|
| +++ /dev/null
|
| @@ -1,166 +0,0 @@
|
| -// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
|
| -// for details. All rights reserved. Use of this source code is governed by a
|
| -// BSD-style license that can be found in the LICENSE file.
|
| -
|
| -import 'dart:async';
|
| -
|
| -import 'package:async/async.dart';
|
| -import 'package:stream_channel/stream_channel.dart';
|
| -
|
| -import '../../backend/group.dart';
|
| -import '../../backend/metadata.dart';
|
| -import '../../backend/test.dart';
|
| -import '../../backend/test_platform.dart';
|
| -import '../../util/remote_exception.dart';
|
| -import '../../util/stack_trace_mapper.dart';
|
| -import '../../utils.dart';
|
| -import '../environment.dart';
|
| -import '../load_exception.dart';
|
| -import '../runner_suite.dart';
|
| -import 'iframe_test.dart';
|
| -
|
| -/// Loads a [RunnerSuite] for a browser.
|
| -///
|
| -/// [channel] should connect to the iframe containing the suite, which should
|
| -/// eventually emit a message containing the suite's test information.
|
| -/// [environment], [path], [platform], and [onClose] are passed to the
|
| -/// [RunnerSuite]. If passed, [mapper] is used to reformat the test's stack
|
| -/// traces.
|
| -Future<RunnerSuite> loadBrowserSuite(StreamChannel channel,
|
| - Environment environment, String path, {StackTraceMapper mapper,
|
| - TestPlatform platform, AsyncFunction onClose}) async {
|
| - // The controller for the returned suite. This is set once we've loaded the
|
| - // information about the tests in the suite.
|
| - var controller;
|
| -
|
| - // A timer that's reset whenever we receive a message from the browser.
|
| - // Because the browser stops running code when the user is actively debugging,
|
| - // this lets us detect whether they're debugging reasonably accurately.
|
| - //
|
| - // The duration should be short enough that the debugging console is open as
|
| - // soon as the user is done setting breakpoints, but long enough that a test
|
| - // doing a lot of synchronous work doesn't trigger a false positive.
|
| - //
|
| - // Start this canceled because we don't want it to start ticking until we get
|
| - // some response from the iframe.
|
| - var timer = new RestartableTimer(new Duration(seconds: 3), () {
|
| - controller.setDebugging(true);
|
| - })..cancel();
|
| -
|
| - // Even though [channel] is probably a [MultiChannel] already, create a
|
| - // nested MultiChannel because the iframe will be using a channel wrapped
|
| - // within the host's channel.
|
| - var suiteChannel = new MultiChannel(channel.changeStream((stream) {
|
| - return stream.map((message) {
|
| - // Whenever we get a message, no matter which child channel it's for, we the
|
| - // browser is still running code which means the using isn't debugging.
|
| - if (controller != null) {
|
| - timer.reset();
|
| - controller.setDebugging(false);
|
| - }
|
| -
|
| - return message;
|
| - });
|
| - }));
|
| -
|
| - var response = await _getResponse(suiteChannel.stream)
|
| - .timeout(new Duration(minutes: 1), onTimeout: () {
|
| - suiteChannel.sink.close();
|
| - throw new LoadException(
|
| - path,
|
| - "Timed out waiting for the test suite to connect.");
|
| - });
|
| -
|
| - try {
|
| - _validateResponse(path, response);
|
| - } catch (_) {
|
| - suiteChannel.sink.close();
|
| - rethrow;
|
| - }
|
| -
|
| - controller = new RunnerSuiteController(environment,
|
| - _deserializeGroup(suiteChannel, response["root"], mapper),
|
| - platform: platform, path: path,
|
| - onClose: () {
|
| - suiteChannel.sink.close();
|
| - timer.cancel();
|
| - controller = null;
|
| - return onClose == null ? null : onClose();
|
| - });
|
| -
|
| - // Start the debugging timer counting down.
|
| - timer.reset();
|
| - return controller.suite;
|
| -}
|
| -
|
| -/// Listens for responses from the iframe on [stream].
|
| -///
|
| -/// Returns the serialized representation of the the root group for the suite,
|
| -/// or a response indicating that an error occurred.
|
| -Future<Map> _getResponse(Stream stream) {
|
| - var completer = new Completer();
|
| - stream.listen((response) {
|
| - if (response["type"] == "print") {
|
| - print(response["line"]);
|
| - } else if (response["type"] != "ping") {
|
| - completer.complete(response);
|
| - }
|
| - }, onDone: () {
|
| - if (!completer.isCompleted) completer.complete();
|
| - });
|
| -
|
| - return completer.future;
|
| -}
|
| -
|
| -/// Throws an error encoded in [response], if there is one.
|
| -///
|
| -/// [path] is used for the error's metadata.
|
| -Future _validateResponse(String path, Map response) {
|
| - if (response == null) {
|
| - throw new LoadException(
|
| - path, "Connection closed before test suite loaded.");
|
| - }
|
| -
|
| - if (response["type"] == "loadException") {
|
| - throw new LoadException(path, response["message"]);
|
| - }
|
| -
|
| - if (response["type"] == "error") {
|
| - var asyncError = RemoteException.deserialize(response["error"]);
|
| - return new Future.error(
|
| - new LoadException(path, asyncError.error),
|
| - asyncError.stackTrace);
|
| - }
|
| -
|
| - return new Future.value();
|
| -}
|
| -
|
| -/// Deserializes [group] into a concrete [Group] class.
|
| -Group _deserializeGroup(MultiChannel suiteChannel, Map group,
|
| - [StackTraceMapper mapper]) {
|
| - var metadata = new Metadata.deserialize(group['metadata']);
|
| - return new Group(group['name'], group['entries'].map((entry) {
|
| - if (entry['type'] == 'group') {
|
| - return _deserializeGroup(suiteChannel, entry, mapper);
|
| - }
|
| -
|
| - return _deserializeTest(suiteChannel, entry, mapper);
|
| - }),
|
| - metadata: metadata,
|
| - setUpAll: _deserializeTest(suiteChannel, group['setUpAll'], mapper),
|
| - tearDownAll:
|
| - _deserializeTest(suiteChannel, group['tearDownAll'], mapper));
|
| -}
|
| -
|
| -/// Deserializes [test] into a concrete [Test] class.
|
| -///
|
| -/// Returns `null` if [test] is `null`.
|
| -Test _deserializeTest(MultiChannel suiteChannel, Map test,
|
| - [StackTraceMapper mapper]) {
|
| - 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);
|
| -}
|
|
|