Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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 | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 library scheduled_server_test; | |
| 6 | |
| 7 import 'dart:async'; | |
| 8 import 'dart:io'; | |
| 9 | |
| 10 import '../../../pkg/http/lib/http.dart' as http; | |
| 11 import '../lib/scheduled_server.dart'; | |
| 12 import '../lib/scheduled_test.dart'; | |
| 13 import '../lib/src/mock_clock.dart' as mock_clock; | |
| 14 | |
| 15 import 'metatest.dart'; | |
| 16 import 'utils.dart'; | |
| 17 | |
| 18 void main() { | |
| 19 expectTestsPass("a server with no handlers does nothing", () { | |
| 20 test('test', () => new ScheduledServer()); | |
| 21 }); | |
| 22 | |
| 23 expectTestsPass("a server with no handlers that receives a request throws an " | |
| 24 "error", () { | |
| 25 var errors; | |
| 26 test('test 1', () { | |
| 27 currentSchedule.onException.schedule(() { | |
| 28 errors = currentSchedule.errors; | |
| 29 }); | |
| 30 | |
| 31 var server = new ScheduledServer(); | |
| 32 expect(server.url.then((url) => http.read(url.resolve('/hello'))), | |
| 33 completion(equals('Hello, test!'))); | |
|
Bob Nystrom
2013/03/13 21:02:35
What is this completion() expectation for? It will
nweiz
2013/03/13 23:50:59
I want this to look like a real test so we catch a
| |
| 34 }); | |
| 35 | |
| 36 test('test 2', () { | |
| 37 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 38 expect(errors.length, equals(2)); | |
| 39 expect(errors[0].error, equals("'scheduled server 0' received GET /hello " | |
| 40 "unexpectedly.")); | |
| 41 expect(errors[1].error, new isInstanceOf<HttpParserException>()); | |
|
Bob Nystrom
2013/03/13 21:02:35
What's this for?
nweiz
2013/03/13 23:50:59
The request gets an HttpParserException because th
| |
| 42 }); | |
| 43 }, passing: ['test 2']); | |
| 44 | |
| 45 expectTestsPass("a handler runs when it's hit", () { | |
| 46 test('test', () { | |
| 47 var server = new ScheduledServer(); | |
| 48 expect(server.url.then((url) => http.read(url.resolve('/hello'))), | |
| 49 completion(equals('Hello, test!'))); | |
| 50 | |
| 51 server.handle('GET', '/hello', (request) { | |
| 52 request.response.write('Hello, test!'); | |
| 53 request.response.close(); | |
| 54 }); | |
| 55 }); | |
| 56 }); | |
| 57 | |
| 58 expectTestsPass("a handler blocks the schedule on the returned future", () { | |
| 59 test('test', () { | |
| 60 var blockedOnFuture = false; | |
| 61 var server = new ScheduledServer(); | |
| 62 expect(server.url.then((url) => http.read(url.resolve('/hello'))), | |
| 63 completion(equals('Hello, test!'))); | |
| 64 | |
| 65 server.handle('GET', '/hello', (request) { | |
| 66 request.response.write('Hello, test!'); | |
| 67 request.response.close(); | |
| 68 return pumpEventQueue().then((_) { | |
| 69 blockedOnFuture = true; | |
| 70 }); | |
| 71 }); | |
| 72 | |
| 73 schedule(() => expect(blockedOnFuture, isTrue)); | |
| 74 }); | |
| 75 }); | |
| 76 | |
| 77 expectTestsPass("a handler fails if it's hit too early", () { | |
| 78 var errors; | |
| 79 test('test 1', () { | |
| 80 currentSchedule.onException.schedule(() { | |
| 81 errors = currentSchedule.errors; | |
| 82 }); | |
| 83 | |
| 84 var server = new ScheduledServer(); | |
| 85 var response = server.url.then((url) => http.read(url.resolve('/hello'))); | |
| 86 expect(response, completion(equals('Hello, test!'))); | |
| 87 | |
| 88 // Block the schedule until we're sure the request has hit the server. | |
| 89 schedule(() => response); | |
| 90 | |
| 91 // Add a task's worth of space to avoid hitting the heuristic of waiting | |
| 92 // for the immediately-preceding task. | |
|
Bob Nystrom
2013/03/13 21:02:35
I'd like to understand this better. Can we talk ab
nweiz
2013/03/13 23:50:59
Done.
| |
| 93 schedule(() => null); | |
| 94 | |
| 95 server.handle('GET', '/hello', (request) { | |
| 96 request.response.write('Hello, test!'); | |
| 97 request.response.close(); | |
| 98 }); | |
| 99 }); | |
| 100 | |
| 101 test('test 2', () { | |
| 102 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 103 expect(errors.length, equals(2)); | |
| 104 expect(errors[0].error, equals("'scheduled server 0' received GET /hello " | |
| 105 "earlier than expected.")); | |
| 106 expect(errors[1].error, new isInstanceOf<HttpParserException>()); | |
| 107 }); | |
| 108 }, passing: ['test 2']); | |
| 109 | |
| 110 expectTestsPass("a handler waits for the immediately prior task to complete " | |
| 111 "before checking if it's too early", () { | |
| 112 test('test', () { | |
| 113 var server = new ScheduledServer(); | |
| 114 expect(server.url.then((url) => http.read(url.resolve('/hello'))), | |
| 115 completion(equals('Hello, test!'))); | |
| 116 | |
| 117 // Sleeping here is unfortunate, but we want to be sure that the HTTP | |
| 118 // request hits the server during this test without actually blocking the | |
| 119 // task on the request completing. | |
| 120 // | |
| 121 // This is also a potential race condition, but hopefully a local HTTP | |
| 122 // request won't take 1s. | |
|
Bob Nystrom
2013/03/13 21:02:35
:(
nweiz
2013/03/13 23:50:59
If you've got a better idea, I'm all ears.
| |
| 123 schedule(() => new Future.delayed(new Duration(seconds: 1))); | |
| 124 | |
| 125 server.handle('GET', '/hello', (request) { | |
| 126 request.response.write('Hello, test!'); | |
| 127 request.response.close(); | |
| 128 }); | |
| 129 }); | |
| 130 }); | |
| 131 | |
| 132 expectTestsPass("a handler fails if the url is wrong", () { | |
| 133 var errors; | |
| 134 test('test 1', () { | |
| 135 currentSchedule.onException.schedule(() { | |
| 136 errors = currentSchedule.errors; | |
| 137 }); | |
| 138 | |
| 139 var server = new ScheduledServer(); | |
| 140 expect(server.url.then((url) => http.read(url.resolve('/hello'))), | |
| 141 completion(equals('Hello, test!'))); | |
| 142 | |
| 143 server.handle('GET', '/goodbye', (request) { | |
| 144 request.response.write('Goodbye, test!'); | |
| 145 request.response.close(); | |
| 146 }); | |
| 147 }); | |
| 148 | |
| 149 test('test 2', () { | |
| 150 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 151 expect(errors.length, equals(2)); | |
| 152 expect(errors[0].error, equals("'scheduled server 0' expected GET " | |
| 153 "/goodbye, but got GET /hello.")); | |
| 154 expect(errors[1].error, new isInstanceOf<HttpParserException>()); | |
| 155 }); | |
| 156 }, passing: ['test 2']); | |
| 157 | |
| 158 expectTestsPass("a handler fails if the method is wrong", () { | |
| 159 var errors; | |
| 160 test('test 1', () { | |
| 161 currentSchedule.onException.schedule(() { | |
| 162 errors = currentSchedule.errors; | |
| 163 }); | |
| 164 | |
| 165 var server = new ScheduledServer(); | |
| 166 expect(server.url.then((url) => http.head(url.resolve('/hello'))), | |
| 167 completes); | |
| 168 | |
| 169 server.handle('GET', '/hello', (request) { | |
| 170 request.response.write('Hello, test!'); | |
| 171 request.response.close(); | |
| 172 }); | |
| 173 }); | |
| 174 | |
| 175 test('test 2', () { | |
| 176 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 177 expect(errors.length, equals(2)); | |
| 178 expect(errors[0].error, equals("'scheduled server 0' expected GET " | |
| 179 "/hello, but got HEAD /hello.")); | |
| 180 expect(errors[1].error, new isInstanceOf<HttpParserException>()); | |
| 181 }); | |
| 182 }, passing: ['test 2']); | |
| 183 | |
| 184 expectTestsPass("a handler times out waiting to be hit", () { | |
| 185 var clock = mock_clock.mock()..run(); | |
| 186 var timeOfException; | |
| 187 var errors; | |
| 188 test('test 1', () { | |
| 189 currentSchedule.timeout = new Duration(milliseconds: 2); | |
| 190 currentSchedule.onException.schedule(() { | |
| 191 timeOfException = clock.time; | |
| 192 errors = currentSchedule.errors; | |
| 193 }); | |
| 194 | |
| 195 var server = new ScheduledServer(); | |
| 196 | |
| 197 server.handle('GET', '/hello', (request) { | |
| 198 request.response.write('Hello, test!'); | |
| 199 request.response.close(); | |
| 200 }); | |
| 201 }); | |
| 202 | |
| 203 test('test 2', () { | |
| 204 expect(clock.time, equals(2)); | |
| 205 | |
| 206 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 207 expect(errors.map((e) => e.error), equals(["The schedule timed out after " | |
| 208 "0:00:00.002000 of inactivity."])); | |
| 209 }); | |
| 210 }, passing: ['test 2']); | |
| 211 | |
| 212 expectTestsPass("multiple handlers in series respond to requests in series", | |
| 213 () { | |
| 214 test('test', () { | |
| 215 var server = new ScheduledServer(); | |
| 216 expect(server.url.then((url) { | |
| 217 return http.read(url.resolve('/hello/1')).then((response) { | |
| 218 expect(response, equals('Hello, request 1!')); | |
| 219 return http.read(url.resolve('/hello/2')); | |
| 220 }).then((response) { | |
| 221 expect(response, equals('Hello, request 2!')); | |
| 222 return http.read(url.resolve('/hello/3')); | |
| 223 }).then((response) => expect(response, equals('Hello, request 3!'))); | |
| 224 }), completes); | |
| 225 | |
| 226 server.handle('GET', '/hello/1', (request) { | |
| 227 request.response.write('Hello, request 1!'); | |
| 228 request.response.close(); | |
| 229 }); | |
| 230 | |
| 231 server.handle('GET', '/hello/2', (request) { | |
| 232 request.response.write('Hello, request 2!'); | |
| 233 request.response.close(); | |
| 234 }); | |
| 235 | |
| 236 server.handle('GET', '/hello/3', (request) { | |
| 237 request.response.write('Hello, request 3!'); | |
| 238 request.response.close(); | |
| 239 }); | |
| 240 }); | |
| 241 }); | |
| 242 | |
| 243 expectTestsPass("a server that receives a request after all its handlers " | |
| 244 "have run throws an error", () { | |
| 245 var errors; | |
| 246 test('test 1', () { | |
| 247 currentSchedule.onException.schedule(() { | |
| 248 errors = currentSchedule.errors; | |
| 249 }); | |
| 250 | |
| 251 var server = new ScheduledServer(); | |
| 252 expect(server.url.then((url) { | |
| 253 return http.read(url.resolve('/hello/1')).then((response) { | |
| 254 expect(response, equals('Hello, request 1!')); | |
| 255 return http.read(url.resolve('/hello/2')); | |
| 256 }).then((response) { | |
| 257 expect(response, equals('Hello, request 2!')); | |
| 258 return http.read(url.resolve('/hello/3')); | |
| 259 }).then((response) => expect(response, equals('Hello, request 3!'))); | |
| 260 }), completes); | |
| 261 | |
| 262 server.handle('GET', '/hello/1', (request) { | |
| 263 request.response.write('Hello, request 1!'); | |
| 264 request.response.close(); | |
| 265 }); | |
| 266 | |
| 267 server.handle('GET', '/hello/2', (request) { | |
| 268 request.response.write('Hello, request 2!'); | |
| 269 request.response.close(); | |
| 270 }); | |
| 271 }); | |
| 272 | |
| 273 test('test 2', () { | |
| 274 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 275 expect(errors.length, equals(2)); | |
| 276 expect(errors[0].error, equals("'scheduled server 0' received GET " | |
| 277 "/hello/3 unexpectedly.")); | |
| 278 expect(errors[1].error, new isInstanceOf<HttpParserException>()); | |
| 279 }); | |
| 280 }, passing: ['test 2']); | |
| 281 | |
| 282 expectTestsPass("an error in a handler doesn't cause a timeout", () { | |
| 283 var errors; | |
| 284 test('test 1', () { | |
| 285 currentSchedule.onException.schedule(() { | |
| 286 errors = currentSchedule.errors; | |
| 287 }); | |
| 288 | |
| 289 var server = new ScheduledServer(); | |
| 290 expect(server.url.then((url) => http.read(url.resolve('/hello'))), | |
| 291 completion(equals('Hello, test!'))); | |
| 292 | |
| 293 server.handle('GET', '/hello', (request) { | |
| 294 throw 'oh no'; | |
| 295 }); | |
| 296 }); | |
| 297 | |
| 298 test('test 2', () { | |
| 299 expect(errors, everyElement(new isInstanceOf<ScheduleError>())); | |
| 300 expect(errors.length, equals(2)); | |
| 301 expect(errors[0].error, equals('oh no')); | |
| 302 expect(errors[1].error, new isInstanceOf<HttpParserException>()); | |
| 303 }); | |
| 304 }, passing: ['test 2']); | |
| 305 } | |
| OLD | NEW |