Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(260)

Side by Side Diff: tests/standalone/io/http_advanced_test.dart

Issue 27215002: Very simple version of Isolates. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address Anders' comment. Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 // 4 //
5 // VMOptions= 5 // VMOptions=
6 // VMOptions=--short_socket_read 6 // VMOptions=--short_socket_read
7 // VMOptions=--short_socket_write 7 // VMOptions=--short_socket_write
8 // VMOptions=--short_socket_read --short_socket_write 8 // VMOptions=--short_socket_read --short_socket_write
9 9
10 import "package:expect/expect.dart"; 10 import "package:expect/expect.dart";
11 import 'dart:async'; 11 import 'dart:async';
12 import 'dart:io'; 12 import 'dart:io';
13 import 'dart:isolate'; 13 import 'dart:isolate';
14 14
15 class IsolatedHttpServer { 15 class IsolatedHttpServer {
16 IsolatedHttpServer() 16 IsolatedHttpServer()
17 : _statusPort = new ReceivePort(), 17 : _statusPort = new ReceivePort(),
18 _serverPort = null { 18 _serverPort = null;
19 _serverPort = spawnFunction(startIsolatedHttpServer);
20 }
21 19
22 void setServerStartedHandler(void startedCallback(int port)) { 20 void setServerStartedHandler(void startedCallback(int port)) {
23 _startedCallback = startedCallback; 21 _startedCallback = startedCallback;
24 } 22 }
25 23
26 void start() { 24 void start() {
25 ReceivePort receivePort = new ReceivePort();
26 var remote = Isolate.spawn(startIsolatedHttpServer, receivePort.sendPort);
27 receivePort.first.then((port) {
28 _serverPort = port;
29
30 // Send server start message to the server.
31 var command = new IsolatedHttpServerCommand.start();
32 port.send([command, _statusPort.sendPort]);
33 });
34
27 // Handle status messages from the server. 35 // Handle status messages from the server.
28 _statusPort.receive((var status, SendPort replyTo) { 36 _statusPort.listen((var status) {
29 if (status.isStarted) { 37 if (status.isStarted) {
30 _startedCallback(status.port); 38 _startedCallback(status.port);
31 } 39 }
32 }); 40 });
33
34 // Send server start message to the server.
35 var command = new IsolatedHttpServerCommand.start();
36 _serverPort.send(command, _statusPort.toSendPort());
37 } 41 }
38 42
39 void shutdown() { 43 void shutdown() {
40 // Send server stop message to the server. 44 // Send server stop message to the server.
41 _serverPort.send(new IsolatedHttpServerCommand.stop(), 45 _serverPort.send([new IsolatedHttpServerCommand.stop(),
42 _statusPort.toSendPort()); 46 _statusPort.sendPort]);
43 _statusPort.close(); 47 _statusPort.close();
44 } 48 }
45 49
46 void chunkedEncoding() { 50 void chunkedEncoding() {
47 // Send chunked encoding message to the server. 51 // Send chunked encoding message to the server.
48 _serverPort.send( 52 _serverPort.send([
49 new IsolatedHttpServerCommand.chunkedEncoding(), 53 new IsolatedHttpServerCommand.chunkedEncoding(),
50 _statusPort.toSendPort()); 54 _statusPort.sendPort]);
51 } 55 }
52 56
53 ReceivePort _statusPort; // Port for receiving messages from the server. 57 ReceivePort _statusPort; // Port for receiving messages from the server.
54 SendPort _serverPort; // Port for sending messages to the server. 58 SendPort _serverPort; // Port for sending messages to the server.
55 var _startedCallback; 59 var _startedCallback;
56 } 60 }
57 61
58 62
59 class IsolatedHttpServerCommand { 63 class IsolatedHttpServerCommand {
60 static const START = 0; 64 static const START = 0;
(...skipping 25 matching lines...) Expand all
86 bool get isStopped => _state == STOPPED; 90 bool get isStopped => _state == STOPPED;
87 bool get isError => _state == ERROR; 91 bool get isError => _state == ERROR;
88 92
89 int get port => _port; 93 int get port => _port;
90 94
91 int _state; 95 int _state;
92 int _port; 96 int _port;
93 } 97 }
94 98
95 99
96 void startIsolatedHttpServer() { 100 void startIsolatedHttpServer(SendPort replyTo) {
97 var server = new TestServer(); 101 var server = new TestServer();
98 server.init(); 102 server.init();
99 port.receive(server.dispatch); 103 replyTo.send(server.dispatchSendPort);
100 } 104 }
101 105
102 106
103 class TestServer { 107 class TestServer {
104 // Return a 404. 108 // Return a 404.
105 void _notFoundHandler(HttpRequest request) { 109 void _notFoundHandler(HttpRequest request) {
106 var response = request.response; 110 var response = request.response;
107 response.statusCode = HttpStatus.NOT_FOUND; 111 response.statusCode = HttpStatus.NOT_FOUND;
108 response.headers.set("Content-Type", "text/html; charset=UTF-8"); 112 response.headers.set("Content-Type", "text/html; charset=UTF-8");
109 response.outputStream.writeString("Page not found"); 113 response.outputStream.writeString("Page not found");
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 void init() { 198 void init() {
195 // Setup request handlers. 199 // Setup request handlers.
196 _requestHandlers = new Map(); 200 _requestHandlers = new Map();
197 _requestHandlers["/host"] = _hostHandler; 201 _requestHandlers["/host"] = _hostHandler;
198 _requestHandlers["/expires1"] = _expires1Handler; 202 _requestHandlers["/expires1"] = _expires1Handler;
199 _requestHandlers["/expires2"] = _expires2Handler; 203 _requestHandlers["/expires2"] = _expires2Handler;
200 _requestHandlers["/contenttype1"] = _contentType1Handler; 204 _requestHandlers["/contenttype1"] = _contentType1Handler;
201 _requestHandlers["/contenttype2"] = _contentType2Handler; 205 _requestHandlers["/contenttype2"] = _contentType2Handler;
202 _requestHandlers["/cookie1"] = _cookie1Handler; 206 _requestHandlers["/cookie1"] = _cookie1Handler;
203 _requestHandlers["/cookie2"] = _cookie2Handler; 207 _requestHandlers["/cookie2"] = _cookie2Handler;
208 _dispatchPort = new ReceivePort();
209 _dispatchPort.listen(dispatch);
204 } 210 }
205 211
206 void dispatch(message, replyTo) { 212 SendPort get dispatchSendPort => _dispatchPort.sendPort;
207 if (message.isStart) { 213
214 void dispatch(message) {
215 IsolatedHttpServerCommand command = message[0];
216 SendPort replyTo = message[1];
217 if (command.isStart) {
208 try { 218 try {
209 HttpServer.bind("127.0.0.1", 0).then((server) { 219 HttpServer.bind("127.0.0.1", 0).then((server) {
210 _server = server; 220 _server = server;
211 _server.listen(_requestReceivedHandler); 221 _server.listen(_requestReceivedHandler);
212 replyTo.send(new IsolatedHttpServerStatus.started(_server.port), 222 replyTo.send(new IsolatedHttpServerStatus.started(_server.port),
213 null); 223 null);
214 }); 224 });
215 } catch (e) { 225 } catch (e) {
216 replyTo.send(new IsolatedHttpServerStatus.error(), null); 226 replyTo.send(new IsolatedHttpServerStatus.error(), null);
217 } 227 }
218 } else if (message.isStop) { 228 } else if (command.isStop) {
219 _server.close(); 229 _server.close();
220 port.close(); 230 _dispatchPort.close();
221 replyTo.send(new IsolatedHttpServerStatus.stopped(), null); 231 replyTo.send(new IsolatedHttpServerStatus.stopped(), null);
222 } else if (message.isChunkedEncoding) { 232 } else if (command.isChunkedEncoding) {
223 _chunkedEncoding = true; 233 _chunkedEncoding = true;
224 } 234 }
225 } 235 }
226 236
227 void _requestReceivedHandler(HttpRequest request) { 237 void _requestReceivedHandler(HttpRequest request) {
228 var requestHandler =_requestHandlers[request.uri.path]; 238 var requestHandler =_requestHandlers[request.uri.path];
229 if (requestHandler != null) { 239 if (requestHandler != null) {
230 requestHandler(request); 240 requestHandler(request);
231 } else { 241 } else {
232 _notFoundHandler(request); 242 _notFoundHandler(request);
233 } 243 }
234 } 244 }
235 245
236 HttpServer _server; // HTTP server instance. 246 HttpServer _server; // HTTP server instance.
247 ReceivePort _dispatchPort;
237 Map _requestHandlers; 248 Map _requestHandlers;
238 bool _chunkedEncoding = false; 249 bool _chunkedEncoding = false;
239 } 250 }
240 251
241 Future testHost() { 252 Future testHost() {
242 Completer completer = new Completer(); 253 Completer completer = new Completer();
243 IsolatedHttpServer server = new IsolatedHttpServer(); 254 IsolatedHttpServer server = new IsolatedHttpServer();
244 server.setServerStartedHandler((int port) { 255 server.setServerStartedHandler((int port) {
245 HttpClient httpClient = new HttpClient(); 256 HttpClient httpClient = new HttpClient();
246 httpClient.get("127.0.0.1", port, "/host") 257 httpClient.get("127.0.0.1", port, "/host")
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
421 432
422 void main() { 433 void main() {
423 testHost().then((_) { 434 testHost().then((_) {
424 return testExpires().then((_) { 435 return testExpires().then((_) {
425 return testContentType().then((_) { 436 return testContentType().then((_) {
426 return testCookies(); 437 return testCookies();
427 }); 438 });
428 }); 439 });
429 }); 440 });
430 } 441 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698