| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 #library("http_test.dart"); | |
| 6 #import("../../../chat/http.dart"); | |
| 7 #import("../../../../client/json/dart_json.dart"); | |
| 8 #import("../../../chat/chat_server_lib.dart"); | |
| 9 | |
| 10 | |
| 11 class TestServerMain { | |
| 12 TestServerMain() | |
| 13 : _statusPort = new ReceivePort(), | |
| 14 _serverPort = null { | |
| 15 new TestServer().spawn().then((SendPort port) { | |
| 16 _serverPort = port; | |
| 17 }); | |
| 18 } | |
| 19 | |
| 20 void setServerStartedHandler(void startedCallback(int port)) { | |
| 21 _startedCallback = startedCallback; | |
| 22 } | |
| 23 | |
| 24 void start() { | |
| 25 // Handle status messages from the server. | |
| 26 _statusPort.receive( | |
| 27 void _(var status, SendPort replyTo) { | |
| 28 if (status.isStarted) { | |
| 29 _startedCallback(status.port); | |
| 30 } | |
| 31 }); | |
| 32 | |
| 33 // Send server start message to the server. | |
| 34 var command = new TestServerCommand.start(); | |
| 35 _serverPort.send(command, _statusPort.toSendPort()); | |
| 36 } | |
| 37 | |
| 38 void shutdown() { | |
| 39 // Send server stop message to the server. | |
| 40 _serverPort.send(new TestServerCommand.stop(), _statusPort.toSendPort()); | |
| 41 _statusPort.close(); | |
| 42 } | |
| 43 | |
| 44 void chunkedEncoding() { | |
| 45 // Send chunked encoding message to the server. | |
| 46 _serverPort.send( | |
| 47 new TestServerCommand.chunkedEncoding(), _statusPort.toSendPort()); | |
| 48 _statusPort.close(); | |
| 49 } | |
| 50 | |
| 51 ReceivePort _statusPort; // Port for receiving messages from the server. | |
| 52 SendPort _serverPort; // Port for sending messages to the server. | |
| 53 var _startedCallback; | |
| 54 } | |
| 55 | |
| 56 | |
| 57 class TestServerCommand { | |
| 58 static final START = 0; | |
| 59 static final STOP = 1; | |
| 60 static final CHUNKED_ENCODING = 1; | |
| 61 | |
| 62 TestServerCommand.start() : _command = START; | |
| 63 TestServerCommand.stop() : _command = STOP; | |
| 64 TestServerCommand.chunkedEncoding() : _command = CHUNKED_ENCODING; | |
| 65 | |
| 66 bool get isStart() => _command == START; | |
| 67 bool get isStop() => _command == STOP; | |
| 68 bool get isChunkedEncoding() => _command == CHUNKED_ENCODING; | |
| 69 | |
| 70 int _command; | |
| 71 } | |
| 72 | |
| 73 | |
| 74 class TestServerStatus { | |
| 75 static final STARTED = 0; | |
| 76 static final STOPPED = 1; | |
| 77 static final ERROR = 2; | |
| 78 | |
| 79 TestServerStatus.started(this._port) : _state = STARTED; | |
| 80 TestServerStatus.stopped() : _state = STOPPED; | |
| 81 TestServerStatus.error() : _state = ERROR; | |
| 82 | |
| 83 bool get isStarted() => _state == STARTED; | |
| 84 bool get isStopped() => _state == STOPPED; | |
| 85 bool get isError() => _state == ERROR; | |
| 86 | |
| 87 int get port() => _port; | |
| 88 | |
| 89 int _state; | |
| 90 int _port; | |
| 91 } | |
| 92 | |
| 93 | |
| 94 class TestServer extends Isolate { | |
| 95 // Echo the request content back to the response. | |
| 96 void _echoHandler(HTTPRequest request, HTTPResponse response) { | |
| 97 Expect.equals("POST", request.method); | |
| 98 request.dataEnd = | |
| 99 void _(String body) { | |
| 100 response.writeString(body); | |
| 101 //response.contentLength = body.length; | |
| 102 //response.writeList(body.charCodes(), 0, body.length); | |
| 103 response.writeDone(); | |
| 104 }; | |
| 105 } | |
| 106 | |
| 107 // Echo the request content back to the response. | |
| 108 void _zeroToTenHandler(HTTPRequest request, HTTPResponse response) { | |
| 109 Expect.equals("GET", request.method); | |
| 110 request.dataEnd = | |
| 111 void _(String body) { | |
| 112 response.writeString("01234567890"); | |
| 113 response.writeDone(); | |
| 114 }; | |
| 115 } | |
| 116 | |
| 117 // Return a 404. | |
| 118 void _notFoundHandler(HTTPRequest request, HTTPResponse response) { | |
| 119 response.statusCode = HTTPStatus.NOT_FOUND; | |
| 120 response.setHeader("Content-Type", "text/html; charset=UTF-8"); | |
| 121 response.writeString("Page not found"); | |
| 122 response.writeDone(); | |
| 123 } | |
| 124 | |
| 125 void main() { | |
| 126 // Setup request handlers. | |
| 127 _requestHandlers = new Map(); | |
| 128 _requestHandlers["/echo"] = | |
| 129 (HTTPRequest request, HTTPResponse response) => | |
| 130 _echoHandler(request, response); | |
| 131 _requestHandlers["/0123456789"] = | |
| 132 (HTTPRequest request, HTTPResponse response) => | |
| 133 _zeroToTenHandler(request, response); | |
| 134 | |
| 135 this.port.receive( | |
| 136 void _(var message, SendPort replyTo) { | |
| 137 if (message.isStart) { | |
| 138 _server = new HTTPServer(); | |
| 139 try { | |
| 140 _chunkedEncoding = false; | |
| 141 _server.listen( | |
| 142 "127.0.0.1", | |
| 143 0, | |
| 144 (HTTPRequest req, HTTPResponse rsp) => | |
| 145 _requestReceivedHandler(req, rsp)); | |
| 146 replyTo.send(new TestServerStatus.started(_server.port), null); | |
| 147 } catch (var e) { | |
| 148 replyTo.send(new TestServerStatus.error(), null); | |
| 149 } | |
| 150 } else if (message.isStop) { | |
| 151 _server.close(); | |
| 152 this.port.close(); | |
| 153 replyTo.send(new TestServerStatus.stopped(), null); | |
| 154 } else if (message.isChunkedEncoding) { | |
| 155 _chunkedEncoding = true; | |
| 156 } | |
| 157 }); | |
| 158 } | |
| 159 | |
| 160 void _requestReceivedHandler(HTTPRequest request, HTTPResponse response) { | |
| 161 var requestHandler =_requestHandlers[request.path]; | |
| 162 if (requestHandler != null) { | |
| 163 requestHandler(request, response); | |
| 164 } else { | |
| 165 _notFoundHandler(request, response); | |
| 166 } | |
| 167 } | |
| 168 | |
| 169 HTTPServer _server; // HTTP server instance. | |
| 170 Map _requestHandlers; | |
| 171 bool _chunkedEncoding; | |
| 172 } | |
| 173 | |
| 174 | |
| 175 void testStartStop() { | |
| 176 TestServerMain testServerMain = new TestServerMain(); | |
| 177 testServerMain.setServerStartedHandler( | |
| 178 void _(int port) { | |
| 179 testServerMain.shutdown(); | |
| 180 }); | |
| 181 testServerMain.start(); | |
| 182 } | |
| 183 | |
| 184 | |
| 185 void testGET() { | |
| 186 TestServerMain testServerMain = new TestServerMain(); | |
| 187 testServerMain.setServerStartedHandler( | |
| 188 void _(int port) { | |
| 189 HTTPClient httpClient = new HTTPClient(); | |
| 190 HTTPClientRequest request = httpClient.open("GET", | |
| 191 "127.0.0.1", | |
| 192 port, | |
| 193 "/0123456789"); | |
| 194 request.responseReceived = | |
| 195 void _(HTTPClientResponse response) { | |
| 196 Expect.equals(HTTPStatus.OK, response.statusCode); | |
| 197 response.dataEnd = | |
| 198 void _(String body) { | |
| 199 Expect.equals("01234567890", body); | |
| 200 httpClient.shutdown(); | |
| 201 testServerMain.shutdown(); | |
| 202 }; | |
| 203 }; | |
| 204 request.writeDone(); | |
| 205 }); | |
| 206 testServerMain.start(); | |
| 207 } | |
| 208 | |
| 209 | |
| 210 void testPOST(bool chunkedEncoding) { | |
| 211 String data = "ABCDEFGHIJKLMONPQRSTUVWXYZ"; | |
| 212 final int kMessageCount = 10; | |
| 213 | |
| 214 TestServerMain testServerMain = new TestServerMain(); | |
| 215 | |
| 216 void runTest(int port) { | |
| 217 int count = 0; | |
| 218 HTTPClient httpClient = new HTTPClient(); | |
| 219 void sendRequest() { | |
| 220 HTTPClientRequest request = httpClient.open("POST", | |
| 221 "127.0.0.1", | |
| 222 port, | |
| 223 "/echo"); | |
| 224 | |
| 225 request.responseReceived = | |
| 226 void _(HTTPClientResponse response) { | |
| 227 Expect.equals(HTTPStatus.OK, response.statusCode); | |
| 228 response.dataEnd = | |
| 229 void _(String body) { | |
| 230 Expect.equals(data, body); | |
| 231 count++; | |
| 232 if (count < kMessageCount) { | |
| 233 sendRequest(); | |
| 234 } else { | |
| 235 httpClient.shutdown(); | |
| 236 testServerMain.shutdown(); | |
| 237 } | |
| 238 }; | |
| 239 }; | |
| 240 | |
| 241 if (chunkedEncoding) { | |
| 242 request.writeString(data); | |
| 243 } else { | |
| 244 request.contentLength = data.length; | |
| 245 request.writeList(data.charCodes(), 0, data.length); | |
| 246 } | |
| 247 request.writeDone(); | |
| 248 } | |
| 249 | |
| 250 sendRequest(); | |
| 251 } | |
| 252 | |
| 253 testServerMain.setServerStartedHandler(runTest); | |
| 254 testServerMain.start(); | |
| 255 if (chunkedEncoding) { | |
| 256 testServerMain.chunkedEncoding(); | |
| 257 } | |
| 258 } | |
| 259 | |
| 260 | |
| 261 void test404() { | |
| 262 TestServerMain testServerMain = new TestServerMain(); | |
| 263 testServerMain.setServerStartedHandler( | |
| 264 void _(int port) { | |
| 265 HTTPClient httpClient = new HTTPClient(); | |
| 266 HTTPClientRequest request = httpClient.open("GET", | |
| 267 "127.0.0.1", | |
| 268 port, | |
| 269 "/thisisnotfound"); | |
| 270 request.writeDone(); | |
| 271 request.keepAlive = false; | |
| 272 request.responseReceived = | |
| 273 void _(HTTPClientResponse response) { | |
| 274 Expect.equals(HTTPStatus.NOT_FOUND, response.statusCode); | |
| 275 httpClient.shutdown(); | |
| 276 testServerMain.shutdown(); | |
| 277 }; | |
| 278 }); | |
| 279 testServerMain.start(); | |
| 280 } | |
| 281 | |
| 282 | |
| 283 void main() { | |
| 284 testStartStop(); | |
| 285 testGET(); | |
| 286 testPOST(true); | |
| 287 testPOST(false); | |
| 288 test404(); | |
| 289 } | |
| OLD | NEW |