Commit 79ceee73 authored by Hixie's avatar Hixie

Port our testing framework to new test library

parent cbd49315
......@@ -10,12 +10,14 @@ import 'package:path/path.dart' as p;
import 'package:sky_tools/src/test/json_socket.dart';
import 'package:sky_tools/src/test/remote_test.dart';
import 'package:stack_trace/stack_trace.dart';
import 'package:test/src/backend/group.dart';
import 'package:test/src/backend/group_entry.dart';
import 'package:test/src/backend/metadata.dart';
import 'package:test/src/backend/test_platform.dart';
import 'package:test/src/runner/configuration.dart';
import 'package:test/src/runner/hack_load_vm_file_hook.dart' as hack;
import 'package:test/src/runner/load_exception.dart';
import 'package:test/src/runner/runner_suite.dart';
import 'package:test/src/runner/hack_load_vm_file_hook.dart' as hack;
import 'package:test/src/runner/vm/environment.dart';
import 'package:test/src/util/io.dart';
import 'package:test/src/util/remote_exception.dart';
......@@ -82,7 +84,7 @@ void main() {
}
''');
Completer completer = new Completer();
Completer<Iterable<GroupEntry>> completer = new Completer<Iterable<GroupEntry>>();
Process process = await _startProcess(listenerFile.path,
packageRoot: p.absolute(config.packageRoot));
......@@ -105,44 +107,43 @@ void main() {
}
});
Future<JSONSocket> socket = (() async {
return new JSONSocket(await info.socket);
})();
socket.then((JSONSocket socket) async {
await cleanupTempDirectory();
JSONSocket socket = new JSONSocket(await info.socket);
StreamSubscription subscription;
subscription = socket.stream.listen((response) {
if (response["type"] == "print") {
print(response["line"]);
} else if (response["type"] == "loadException") {
process.kill();
completer.completeError(
new LoadException(path, response["message"]),
new Trace.current());
} else if (response["type"] == "error") {
process.kill();
AsyncError asyncError = RemoteException.deserialize(response["error"]);
completer.completeError(
new LoadException(path, asyncError.error),
asyncError.stackTrace);
} else {
assert(response["type"] == "success");
subscription.cancel();
completer.complete(response["tests"]);
}
});
});
await cleanupTempDirectory();
return new RunnerSuite(const VMEnvironment(),
(await completer.future).map((test) {
StreamSubscription subscription;
subscription = socket.stream.listen((response) {
if (response["type"] == "print") {
print(response["line"]);
} else if (response["type"] == "loadException") {
process.kill();
completer.completeError(
new LoadException(path, response["message"]),
new Trace.current());
} else if (response["type"] == "error") {
process.kill();
AsyncError asyncError = RemoteException.deserialize(response["error"]);
completer.completeError(
new LoadException(path, asyncError.error),
asyncError.stackTrace);
} else {
assert(response["type"] == "success");
subscription.cancel();
completer.complete(response["tests"].map((test) {
var testMetadata = new Metadata.deserialize(test['metadata']);
return new RemoteTest(test['name'], testMetadata, socket, test['index']);
}),
metadata: metadata,
path: path,
platform: TestPlatform.vm,
os: currentOS,
onClose: process.kill);
}));
}
});
Iterable<GroupEntry> entries = await completer.future;
return new RunnerSuite(
const VMEnvironment(),
new Group.root(entries, metadata: metadata),
path: path,
platform: TestPlatform.vm,
os: currentOS,
onClose: process.kill
);
}
......@@ -41,7 +41,7 @@ class RemoteListener {
Isolate.current.setErrorsFatal(false);
Isolate.current.addErrorListener(errorPort.sendPort);
errorPort.listen((message) {
// Masquerade as an IsoalteSpawnException because that's what this would
// Masquerade as an IsolateSpawnException because that's what this would
// be if the error had been detected statically.
var error = new IsolateSpawnException(message[0]);
var stackTrace =
......@@ -69,7 +69,7 @@ class RemoteListener {
return;
}
Declarer declarer = new Declarer();
Declarer declarer = new Declarer(metadata);
try {
await runZoned(() => new Future.sync(main), zoneValues: {
#test.declarer: declarer
......@@ -84,8 +84,8 @@ class RemoteListener {
return;
}
Suite suite = new Suite(declarer.tests,
platform: TestPlatform.vm, os: currentOS, metadata: metadata);
Suite suite = new Suite(declarer.build(),
platform: TestPlatform.vm, os: currentOS);
new RemoteListener._(suite, socket)._listen();
}
......@@ -101,8 +101,10 @@ class RemoteListener {
void _listen() {
List tests = [];
for (var i = 0; i < _suite.tests.length; i++) {
Test test = _suite.tests[i];
for (var i = 0; i < _suite.group.entries.length; i++) {
// TODO(ianh): entries[] might return a Group instead of a Test. We don't
// currently support nested groups.
Test test = _suite.group.entries[i];
tests.add({
"name": test.name,
"metadata": test.metadata.serialize(),
......@@ -118,7 +120,9 @@ class RemoteListener {
var message = JSON.decode(data);
if (message['command'] == 'run') {
assert(_liveTest == null);
Test test = _suite.tests[message['index']];
// TODO(ianh): entries[] might return a Group instead of a Test. We don't
// currently support nested groups.
Test test = _suite.group.entries[message['index']];
_liveTest = test.load(_suite);
_liveTest.onStateChange.listen((state) {
......@@ -148,6 +152,8 @@ class RemoteListener {
} else if (message['command'] == 'close') {
_liveTest.close();
_liveTest = null;
} else {
print('remote_listener.dart: ignoring command "${message["command"]}" from test harness');
}
}
}
......@@ -7,18 +7,20 @@ import 'dart:async';
import 'package:test/src/backend/live_test.dart';
import 'package:test/src/backend/live_test_controller.dart';
import 'package:test/src/backend/metadata.dart';
import 'package:test/src/backend/operating_system.dart';
import 'package:test/src/backend/state.dart';
import 'package:test/src/backend/suite.dart';
import 'package:test/src/backend/test.dart';
import 'package:test/src/backend/test_platform.dart';
import 'package:test/src/util/remote_exception.dart';
import 'package:sky_tools/src/test/json_socket.dart';
class RemoteTest implements Test {
class RemoteTest extends Test {
final String name;
final Metadata metadata;
final Future<JSONSocket> _socket;
final JSONSocket _socket;
final int _index;
RemoteTest(this.name, this.metadata, this._socket, this._index);
......@@ -30,10 +32,9 @@ class RemoteTest implements Test {
controller = new LiveTestController(suite, this, () async {
controller.setState(const State(Status.running, Result.success));
JSONSocket socket = await _socket;
socket.send({'command': 'run', 'index': _index});
_socket.send({'command': 'run', 'index': _index});
subscription = socket.stream.listen((message) {
subscription = _socket.stream.listen((message) {
if (message['type'] == 'error') {
AsyncError asyncError = RemoteException.deserialize(message['error']);
controller.addError(asyncError.error, asyncError.stackTrace);
......@@ -52,8 +53,7 @@ class RemoteTest implements Test {
}
});
}, () async {
JSONSocket socket = await _socket;
socket.send({'command': 'close'});
_socket.send({'command': 'close'});
if (subscription != null) {
subscription.cancel();
subscription = null;
......@@ -68,4 +68,10 @@ class RemoteTest implements Test {
if (metadata == null) metadata = this.metadata;
return new RemoteTest(name, metadata, _socket, _index);
}
// TODO(ianh): Implement this if we need it.
Test forPlatform(TestPlatform platform, {OperatingSystem os}) {
assert(false);
return this;
}
}
......@@ -7,6 +7,9 @@
# Fast fail the script on failures.
set -e
# Fetch all our dependencies
pub get
# Verify that the libraries are error free.
pub global activate tuneup
pub global run tuneup check
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment