Index: sdk/lib/_internal/pub/test/serve/utils.dart |
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart |
index 441e139eec65c929112c4ab1f72496dd7dd17d25..0f04f3fc86bd34bdc422ec0149f030161589d1e8 100644 |
--- a/sdk/lib/_internal/pub/test/serve/utils.dart |
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart |
@@ -14,13 +14,15 @@ import 'package:scheduled_test/scheduled_process.dart'; |
import 'package:scheduled_test/scheduled_stream.dart'; |
import 'package:scheduled_test/scheduled_test.dart'; |
+import '../descriptor.dart' as d; |
import '../test_pub.dart'; |
/// The pub process running "pub serve". |
ScheduledProcess _pubServer; |
-/// The ephemeral port assigned to the running server. |
-int _port; |
+/// The ephemeral ports assigned to the running servers, associated with the |
+/// directories they're serving. |
+final _ports = new Map<String, int>(); |
/// The web socket connection to the running pub process, or `null` if no |
/// connection has been made. |
@@ -100,7 +102,8 @@ class DartTransformer extends Transformer { |
/// so may be used to test for errors in the initialization process. |
/// |
/// Returns the `pub serve` process. |
-ScheduledProcess startPubServe([Iterable<String> args]) { |
+ScheduledProcess startPubServe({Iterable<String> args, |
+ bool createWebDir: true}) { |
// Use port 0 to get an ephemeral port. |
var pubArgs = ["serve", "--port=0", "--hostname=127.0.0.1", "--force-poll"]; |
@@ -110,6 +113,7 @@ ScheduledProcess startPubServe([Iterable<String> args]) { |
// timeout to cope with that. |
currentSchedule.timeout *= 1.5; |
+ if (createWebDir) d.dir(appPath, [d.dir("web")]).create(); |
return startPub(args: pubArgs); |
} |
@@ -118,11 +122,17 @@ ScheduledProcess startPubServe([Iterable<String> args]) { |
/// |
/// If [shouldGetFirst] is `true`, validates that pub get is run first. |
/// |
+/// If [createWebDir] is `true`, creates a `web/` directory if one doesn't exist |
+/// so pub doesn't complain about having nothing to serve. |
+/// |
/// Returns the `pub serve` process. |
-ScheduledProcess pubServe({bool shouldGetFirst: false, Iterable<String> args}) { |
- _pubServer = startPubServe(args); |
+ScheduledProcess pubServe({bool shouldGetFirst: false, bool createWebDir: true, |
+ Iterable<String> args}) { |
+ _pubServer = startPubServe(args: args, createWebDir: createWebDir); |
currentSchedule.onComplete.schedule(() { |
+ _ports.clear(); |
+ |
if (_webSocket != null) { |
_webSocket.close(); |
_webSocket = null; |
@@ -134,16 +144,25 @@ ScheduledProcess pubServe({bool shouldGetFirst: false, Iterable<String> args}) { |
_pubServer.stdout.expect(consumeThrough("Got dependencies!")); |
} |
- expect(schedule(() => _pubServer.stdout.next()).then(_parsePort), completes); |
+ // The server should emit one or more ports. |
+ _pubServer.stdout.expect( |
+ consumeWhile(predicate(_parsePort, 'emits server url'))); |
+ schedule(() => expect(_ports, isNot(isEmpty))); |
+ |
return _pubServer; |
} |
+/// The regular expression for parsing pub's output line describing the URL for |
+/// the server. |
+final _parsePortRegExp = new RegExp(r"([^ ]+) +on http://127\.0\.0\.1:(\d+)"); |
+ |
/// Parses the port number from the "Serving blah on 127.0.0.1:1234" line |
/// printed by pub serve. |
-void _parsePort(String line) { |
- var match = new RegExp(r"127\.0\.0\.1:(\d+)").firstMatch(line); |
- assert(match != null); |
- _port = int.parse(match[1]); |
+bool _parsePort(String line) { |
+ var match = _parsePortRegExp.firstMatch(line); |
+ if (match == null) return false; |
+ _ports[match[1]] = int.parse(match[2]); |
+ return true; |
} |
void endPubServe() { |
@@ -154,10 +173,11 @@ void endPubServe() { |
/// verifies that it responds with a body that matches [expectation]. |
/// |
/// [expectation] may either be a [Matcher] or a string to match an exact body. |
+/// [root] indicates which server should be accessed, and defaults to "web". |
/// [headers] may be either a [Matcher] or a map to match an exact headers map. |
-void requestShouldSucceed(String urlPath, expectation, {headers}) { |
+void requestShouldSucceed(String urlPath, expectation, {String root, headers}) { |
schedule(() { |
- return http.get("http://127.0.0.1:$_port/$urlPath").then((response) { |
+ return http.get("${_serverUrl(root)}/$urlPath").then((response) { |
if (expectation != null) expect(response.body, expectation); |
if (headers != null) expect(response.headers, headers); |
}); |
@@ -166,9 +186,11 @@ void requestShouldSucceed(String urlPath, expectation, {headers}) { |
/// Schedules an HTTP request to the running pub server with [urlPath] and |
/// verifies that it responds with a 404. |
-void requestShould404(String urlPath) { |
+/// |
+/// [root] indicates which server should be accessed, and defaults to "web". |
+void requestShould404(String urlPath, {String root}) { |
schedule(() { |
- return http.get("http://127.0.0.1:$_port/$urlPath").then((response) { |
+ return http.get("${_serverUrl(root)}/$urlPath").then((response) { |
expect(response.statusCode, equals(404)); |
}); |
}, "request $urlPath"); |
@@ -178,11 +200,12 @@ void requestShould404(String urlPath) { |
/// verifies that it responds with a redirect to the given [redirectTarget]. |
/// |
/// [redirectTarget] may be either a [Matcher] or a string to match an exact |
-/// URL. |
-void requestShouldRedirect(String urlPath, redirectTarget) { |
+/// URL. [root] indicates which server should be accessed, and defaults to |
+/// "web". |
+void requestShouldRedirect(String urlPath, redirectTarget, {String root}) { |
schedule(() { |
var request = new http.Request("GET", |
- Uri.parse("http://127.0.0.1:$_port/$urlPath")); |
+ Uri.parse("${_serverUrl(root)}/$urlPath")); |
request.followRedirects = false; |
return request.send().then((response) { |
expect(response.statusCode ~/ 100, equals(3)); |
@@ -194,9 +217,11 @@ void requestShouldRedirect(String urlPath, redirectTarget) { |
/// Schedules an HTTP POST to the running pub server with [urlPath] and verifies |
/// that it responds with a 405. |
-void postShould405(String urlPath) { |
+/// |
+/// [root] indicates which server should be accessed, and defaults to "web". |
+void postShould405(String urlPath, {String root}) { |
schedule(() { |
- return http.post("http://127.0.0.1:$_port/$urlPath").then((response) { |
+ return http.post("${_serverUrl(root)}/$urlPath").then((response) { |
expect(response.statusCode, equals(405)); |
}); |
}, "request $urlPath"); |
@@ -217,10 +242,13 @@ Future _ensureWebSocket() { |
if (_webSocket != null) return new Future.value(); |
// Server should already be running. |
- assert(_pubServer != null); |
- assert(_port != null); |
+ expect(_pubServer, isNotNull); |
+ expect(_ports, isNot(isEmpty)); |
- return WebSocket.connect("ws://127.0.0.1:$_port").then((socket) { |
+ // TODO(nweiz): once we have a separate port for a web interface into the |
+ // server, use that port for the websocket interface. |
+ var port = _ports.values.first; |
+ return WebSocket.connect("ws://127.0.0.1:$port").then((socket) { |
_webSocket = socket; |
// TODO(rnystrom): Works around #13913. |
_webSocketBroadcastStream = _webSocket.asBroadcastStream(); |
@@ -241,4 +269,11 @@ void webSocketShouldReply(request, expectation, {bool encodeRequest: true}) { |
expect(JSON.decode(value), expectation); |
}); |
}), "send $request to web socket and expect reply that $expectation"); |
+} |
+ |
+/// Returns the URL for the server serving from [root]. |
+String _serverUrl([String root]) { |
+ if (root == null) root = 'web'; |
+ expect(_ports, contains(root)); |
+ return "http://127.0.0.1:${_ports[root]}"; |
} |