Index: test/http_basic_test.dart |
diff --git a/test/http_basic_test.dart b/test/http_basic_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..02a4455edc06a46a628fc59bd8551ce05da78f11 |
--- /dev/null |
+++ b/test/http_basic_test.dart |
@@ -0,0 +1,342 @@ |
+// Copyright (c) 2017, 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 "dart:isolate"; |
+import "dart:io"; |
+import "package:sync_http/sync_http.dart"; |
+import "package:test/test.dart"; |
+ |
+typedef void ServerCallback(int port); |
+ |
+class TestServerMain { |
+ TestServerMain() : _statusPort = new ReceivePort(); |
+ |
+ ReceivePort _statusPort; // Port for receiving messages from the server. |
+ SendPort _serverPort; // Port for sending messages to the server. |
+ ServerCallback _startedCallback; |
+ |
+ void setServerStartedHandler(ServerCallback startedCallback) { |
+ _startedCallback = startedCallback; |
+ } |
+ |
+ void start() { |
+ ReceivePort receivePort = new ReceivePort(); |
+ Isolate.spawn(startTestServer, receivePort.sendPort); |
+ receivePort.first.then((port) { |
+ _serverPort = port; |
+ |
+ // Send server start message to the server. |
+ var command = new TestServerCommand.start(); |
+ port.send([command, _statusPort.sendPort]); |
+ }); |
+ |
+ // Handle status messages from the server. |
+ _statusPort.listen((var status) { |
+ if (status.isStarted) { |
+ _startedCallback(status.port); |
+ } |
+ }); |
+ } |
+ |
+ void close() { |
+ // Send server stop message to the server. |
+ _serverPort.send([new TestServerCommand.stop(), _statusPort.sendPort]); |
+ _statusPort.close(); |
+ } |
+} |
+ |
+enum TestServerCommandState { |
+ start, |
+ stop, |
+} |
+ |
+class TestServerCommand { |
+ TestServerCommand.start() : _command = TestServerCommandState.start; |
+ TestServerCommand.stop() : _command = TestServerCommandState.stop; |
+ |
+ bool get isStart => (_command == TestServerCommandState.start); |
+ bool get isStop => (_command == TestServerCommandState.stop); |
+ |
+ TestServerCommandState _command; |
+} |
+ |
+enum TestServerStatusState { |
+ started, |
+ stopped, |
+ error, |
+} |
+ |
+class TestServerStatus { |
+ TestServerStatus.started(this._port) : _state = TestServerStatusState.started; |
+ TestServerStatus.stopped() : _state = TestServerStatusState.stopped; |
+ TestServerStatus.error() : _state = TestServerStatusState.error; |
+ |
+ bool get isStarted => (_state == TestServerStatusState.started); |
+ bool get isStopped => (_state == TestServerStatusState.stopped); |
+ bool get isError => (_state == TestServerStatusState.error); |
+ |
+ int get port => _port; |
+ |
+ TestServerStatusState _state; |
+ int _port; |
+} |
+ |
+void startTestServer(SendPort replyTo) { |
+ var server = new TestServer(); |
+ server.init(); |
+ replyTo.send(server.dispatchSendPort); |
+} |
+ |
+class TestServer { |
+ // Echo the request content back to the response. |
+ void _echoHandler(HttpRequest request) { |
+ var response = request.response; |
+ if (request.method != "POST") { |
+ response.close(); |
+ return; |
+ } |
+ response.contentLength = request.contentLength; |
+ request.listen((List<int> data) { |
+ var string = new String.fromCharCodes(data); |
+ response.write(string); |
+ response.close(); |
+ }); |
+ } |
+ |
+ // Echo the request content back to the response. |
+ void _zeroToTenHandler(HttpRequest request) { |
+ var response = request.response; |
+ String msg = "01234567890"; |
+ if (request.method != "GET") { |
+ response.close(); |
+ return; |
+ } |
+ response.contentLength = msg.length; |
+ response.write(msg); |
+ response.close(); |
+ } |
+ |
+ // Return a 404. |
+ void _notFoundHandler(HttpRequest request) { |
+ var response = request.response; |
+ response.statusCode = HttpStatus.NOT_FOUND; |
+ String msg = "Page not found"; |
+ response.contentLength = msg.length; |
+ response.headers.set("Content-Type", "text/html; charset=UTF-8"); |
+ response.write(msg); |
+ response.close(); |
+ } |
+ |
+ // Return a 301 with a custom reason phrase. |
+ void _reasonForMovingHandler(HttpRequest request) { |
+ var response = request.response; |
+ response.statusCode = HttpStatus.MOVED_PERMANENTLY; |
+ response.reasonPhrase = "Don't come looking here any more"; |
+ response.close(); |
+ } |
+ |
+ // Check the "Host" header. |
+ void _hostHandler(HttpRequest request) { |
+ var response = request.response; |
+ expect(1, equals(request.headers["Host"].length)); |
+ expect("www.dartlang.org:1234", equals(request.headers["Host"][0])); |
+ expect("www.dartlang.org", equals(request.headers.host)); |
+ expect(1234, equals(request.headers.port)); |
+ response.statusCode = HttpStatus.OK; |
+ response.close(); |
+ } |
+ |
+ void _hugeHandler(HttpRequest request) { |
+ var response = request.response; |
+ List<int> expected = |
+ new List<int>.generate((1 << 20), (i) => (i + 1) % 256); |
+ String msg = expected.toString(); |
+ response.contentLength = msg.length; |
+ response.statusCode = HttpStatus.OK; |
+ response.write(msg); |
+ response.close(); |
+ } |
+ |
+ void init() { |
+ // Setup request handlers. |
+ _requestHandlers = new Map(); |
+ _requestHandlers["/echo"] = _echoHandler; |
+ _requestHandlers["/0123456789"] = _zeroToTenHandler; |
+ _requestHandlers["/reasonformoving"] = _reasonForMovingHandler; |
+ _requestHandlers["/host"] = _hostHandler; |
+ _requestHandlers["/huge"] = _hugeHandler; |
+ _dispatchPort = new ReceivePort(); |
+ _dispatchPort.listen(dispatch); |
+ } |
+ |
+ SendPort get dispatchSendPort => _dispatchPort.sendPort; |
+ |
+ void dispatch(var message) { |
+ TestServerCommand command = message[0]; |
+ SendPort replyTo = message[1]; |
+ if (command.isStart) { |
+ try { |
+ HttpServer.bind("127.0.0.1", 0).then((server) { |
+ _server = server; |
+ _server.listen(_requestReceivedHandler); |
+ replyTo.send(new TestServerStatus.started(_server.port)); |
+ }); |
+ } catch (e) { |
+ replyTo.send(new TestServerStatus.error()); |
+ } |
+ } else if (command.isStop) { |
+ _server.close(); |
+ _dispatchPort.close(); |
+ replyTo.send(new TestServerStatus.stopped()); |
+ } |
+ } |
+ |
+ void _requestReceivedHandler(HttpRequest request) { |
+ var requestHandler = _requestHandlers[request.uri.path]; |
+ if (requestHandler != null) { |
+ requestHandler(request); |
+ } else { |
+ _notFoundHandler(request); |
+ } |
+ } |
+ |
+ HttpServer _server; // HTTP server instance. |
+ ReceivePort _dispatchPort; |
+ Map _requestHandlers; |
+} |
+ |
+Future testStartStop() async { |
+ Completer completer = new Completer(); |
+ TestServerMain testServerMain = new TestServerMain(); |
+ testServerMain.setServerStartedHandler((int port) { |
+ testServerMain.close(); |
+ completer.complete(); |
+ }); |
+ testServerMain.start(); |
+ return completer.future; |
+} |
+ |
+Future testGET() async { |
+ Completer completer = new Completer(); |
+ TestServerMain testServerMain = new TestServerMain(); |
+ testServerMain.setServerStartedHandler((int port) { |
+ var request = |
+ SyncHttpClient.getUrl(new Uri.http("127.0.0.1:$port", "/0123456789")); |
+ var response = request.close(); |
+ expect(HttpStatus.OK, equals(response.statusCode)); |
+ expect(11, equals(response.contentLength)); |
+ expect("01234567890", equals(response.body)); |
+ testServerMain.close(); |
+ completer.complete(); |
+ }); |
+ testServerMain.start(); |
+ return completer.future; |
+} |
+ |
+Future testPOST() async { |
+ Completer completer = new Completer(); |
+ String data = "ABCDEFGHIJKLMONPQRSTUVWXYZ"; |
+ final int kMessageCount = 10; |
+ |
+ TestServerMain testServerMain = new TestServerMain(); |
+ |
+ void runTest(int port) { |
+ int count = 0; |
+ void sendRequest() { |
+ var request = |
+ SyncHttpClient.postUrl(new Uri.http("127.0.0.1:$port", "/echo")); |
+ request.write(data); |
+ var response = request.close(); |
+ expect(HttpStatus.OK, equals(response.statusCode)); |
+ expect(data, equals(response.body)); |
+ count++; |
+ if (count < kMessageCount) { |
+ sendRequest(); |
+ } else { |
+ testServerMain.close(); |
+ completer.complete(); |
+ } |
+ } |
+ |
+ sendRequest(); |
+ } |
+ |
+ testServerMain.setServerStartedHandler(runTest); |
+ testServerMain.start(); |
+ return completer.future; |
+} |
+ |
+Future test404() async { |
+ Completer completer = new Completer(); |
+ TestServerMain testServerMain = new TestServerMain(); |
+ testServerMain.setServerStartedHandler((int port) { |
+ var request = SyncHttpClient |
+ .getUrl(new Uri.http("127.0.0.1:$port", "/thisisnotfound")); |
+ var response = request.close(); |
+ expect(HttpStatus.NOT_FOUND, equals(response.statusCode)); |
+ expect("Page not found", equals(response.body)); |
+ testServerMain.close(); |
+ completer.complete(); |
+ }); |
+ testServerMain.start(); |
+ return completer.future; |
+} |
+ |
+Future testReasonPhrase() async { |
+ Completer completer = new Completer(); |
+ TestServerMain testServerMain = new TestServerMain(); |
+ testServerMain.setServerStartedHandler((int port) { |
+ var request = SyncHttpClient |
+ .getUrl(new Uri.http("127.0.0.1:$port", "/reasonformoving")); |
+ var response = request.close(); |
+ expect(HttpStatus.MOVED_PERMANENTLY, equals(response.statusCode)); |
+ expect( |
+ "Don't come looking here any more\r\n", equals(response.reasonPhrase)); |
+ testServerMain.close(); |
+ completer.complete(); |
+ }); |
+ testServerMain.start(); |
+ return completer.future; |
+} |
+ |
+Future testHuge() async { |
+ Completer completer = new Completer(); |
+ TestServerMain testServerMain = new TestServerMain(); |
+ testServerMain.setServerStartedHandler((int port) { |
+ var request = |
+ SyncHttpClient.getUrl(new Uri.http("127.0.0.1:$port", "/huge")); |
+ var response = request.close(); |
+ String expected = |
+ new List<int>.generate((1 << 20), (i) => (i + 1) % 256).toString(); |
+ expect(HttpStatus.OK, equals(response.statusCode)); |
+ expect(expected.length, equals(response.contentLength)); |
+ expect(expected.toString(), equals(response.body)); |
+ testServerMain.close(); |
+ completer.complete(); |
+ }); |
+ testServerMain.start(); |
+ return completer.future; |
+} |
+ |
+void main() { |
+ test("Simple server test", () async { |
+ await testStartStop(); |
+ }); |
+ test("Sync HTTP GET test", () async { |
+ await testGET(); |
+ }); |
+ test("Sync HTTP POST test", () async { |
+ await testPOST(); |
+ }); |
+ test("Sync HTTP 404 test", () async { |
+ await test404(); |
+ }); |
+ test("Sync HTTP moved test", () async { |
+ await testReasonPhrase(); |
+ }); |
+ test("Sync HTTP huge test", () async { |
+ await testHuge(); |
+ }); |
+} |