Index: test/browser/chrome_test.dart |
diff --git a/test/browser/chrome_test.dart b/test/browser/chrome_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9393d9194115ace58486af6e6603c8f73ac68a30 |
--- /dev/null |
+++ b/test/browser/chrome_test.dart |
@@ -0,0 +1,131 @@ |
+// 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:unittest/unittest.dart'; |
+import 'package:unittest/src/runner/browser/chrome.dart'; |
+import 'package:unittest/src/util/io.dart'; |
+import 'package:shelf/shelf.dart' as shelf; |
+import 'package:shelf/shelf_io.dart' as shelf_io; |
+import 'package:shelf_web_socket/shelf_web_socket.dart'; |
+ |
+void main() { |
+ group("running JavaScript", () { |
+ // The JavaScript to serve in the server. We use actual JavaScript here to |
+ // avoid the pain of compiling to JS in a test |
+ var javaScript; |
+ |
+ var servePage = (request) { |
Bob Nystrom
2015/02/28 01:02:44
servePage(request) { ...
Does this close over any
nweiz
2015/03/02 22:31:18
It closes over [javaScript].
|
+ if (request.url.path == "/") { |
+ return new shelf.Response.ok(""" |
+<!doctype html> |
+<html> |
+<head> |
+ <script src="index.js"></script> |
+</head> |
+</html> |
+""", headers: {'content-type': 'text/html'}); |
+ } else if (request.url.path == "/index.js") { |
+ return new shelf.Response.ok(javaScript, |
+ headers: {'content-type': 'application/javascript'}); |
+ } else { |
+ return new shelf.Response.notFound(null); |
+ } |
+ }; |
+ |
+ var server; |
+ var webSockets; |
+ setUp(() { |
+ var webSocketsController = new StreamController(); |
+ webSockets = webSocketsController.stream; |
+ |
+ return shelf_io.serve( |
+ new shelf.Cascade() |
+ .add(webSocketHandler(webSocketsController.add)) |
+ .add(servePage).handler, |
+ 'localhost', 0).then((server_) { |
+ server = server_; |
+ }); |
+ }); |
+ |
+ tearDown(() { |
+ if (server != null) server.close(); |
+ |
+ javaScript = null; |
+ server = null; |
+ webSockets = null; |
+ }); |
+ |
+ test("starts Chrome with the given URL", () { |
+ javaScript = ''' |
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://")); |
+webSocket.addEventListener("open", function() { |
+ webSocket.send("loaded!"); |
+}); |
+'''; |
+ var chrome = new Chrome(baseUrlForAddress(server.address, server.port)); |
+ |
+ return webSockets.first.then((webSocket) { |
+ return webSocket.first.then( |
+ (message) => expect(message, equals("loaded!"))); |
+ }).whenComplete(chrome.close); |
+ }); |
+ |
+ test("doesn't preserve state across runs", () { |
+ javaScript = ''' |
+localStorage.setItem("data", "value"); |
+ |
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://")); |
+webSocket.addEventListener("open", function() { |
+ webSocket.send("done"); |
+}); |
+'''; |
+ var chrome = new Chrome(baseUrlForAddress(server.address, server.port)); |
+ |
+ var first = true; |
+ webSockets.listen(expectAsync((webSocket) { |
+ if (first) { |
+ // The first request will set local storage data. We can't kill the |
+ // old chrome and start a new one until we're sure that that has |
+ // finished. |
+ webSocket.first.then((_) { |
+ chrome.close(); |
+ |
+ javaScript = ''' |
+var webSocket = new WebSocket(window.location.href.replace("http://", "ws://")); |
+webSocket.addEventListener("open", function() { |
+ webSocket.send(localStorage.getItem("data")); |
+}); |
+'''; |
+ chrome = new Chrome(baseUrlForAddress(server.address, server.port)); |
+ first = false; |
+ }); |
+ } else { |
+ // The second request will return the local storage data. This should |
+ // be null, indicating that no data was saved between runs. |
+ expect( |
+ webSocket.first |
+ .then((message) => expect(message, equals('null'))) |
+ .whenComplete(chrome.close), |
+ completes); |
+ } |
+ }, count: 2)); |
+ }); |
+ }); |
+ |
+ test("a process can be killed synchronously after it's started", () { |
+ return shelf_io.serve(expectAsync((_) {}, count: 0), 'localhost', 8080) |
+ .then((server) { |
+ var chrome = new Chrome(baseUrlForAddress(server.address, server.port)); |
+ return chrome.close().whenComplete(server.close); |
+ }); |
+ }); |
+ |
+ test("reports an error in onExit", () { |
+ var chrome = new Chrome("http://dart-lang.org", |
+ executable: "_does_not_exist"); |
+ expect(chrome.onExit, throwsA(new isInstanceOf<ProcessException>())); |
+ }); |
+} |