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

Side by Side Diff: test/invoker_test.dart

Issue 914963003: Add a VmListener and IsolateTest class for running tests in other isolates. (Closed) Base URL: git@github.com:dart-lang/unittest@master
Patch Set: Code review changes Created 5 years, 10 months 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
« no previous file with comments | « lib/src/vm_listener.dart ('k') | test/utils.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 import 'dart:async'; 5 import 'dart:async';
6 import 'dart:collection';
7 6
8 import 'package:fake_async/fake_async.dart'; 7 import 'package:fake_async/fake_async.dart';
9 import 'package:unittest/src/invoker.dart'; 8 import 'package:unittest/src/invoker.dart';
10 import 'package:unittest/src/live_test.dart';
11 import 'package:unittest/src/state.dart'; 9 import 'package:unittest/src/state.dart';
12 import 'package:unittest/src/suite.dart'; 10 import 'package:unittest/src/suite.dart';
13 import 'package:unittest/unittest.dart'; 11 import 'package:unittest/unittest.dart';
14 12
15 import 'utils.dart'; 13 import 'utils.dart';
16 14
17 // The last state change detected via [_expectStates].
18 State _lastState;
19
20 void main() { 15 void main() {
21 var suite; 16 var suite;
22 setUp(() { 17 setUp(() {
23 _lastState = null; 18 lastState = null;
24 suite = new Suite("suite", []); 19 suite = new Suite("suite", []);
25 }); 20 });
26 21
27 group("Invoker.current", () { 22 group("Invoker.current", () {
28 test("returns null outside of a test body", () { 23 test("returns null outside of a test body", () {
29 expect(Invoker.current, isNull); 24 expect(Invoker.current, isNull);
30 }); 25 });
31 26
32 test("returns the current invoker in a test body", () { 27 test("returns the current invoker in a test body", () {
33 var invoker; 28 var invoker;
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
163 return liveTest.run(); 158 return liveTest.run();
164 }); 159 });
165 }); 160 });
166 161
167 group("in a test with failures,", () { 162 group("in a test with failures,", () {
168 test("a synchronous throw is reported and causes the test to fail", () { 163 test("a synchronous throw is reported and causes the test to fail", () {
169 var liveTest = new LocalTest("test", () { 164 var liveTest = new LocalTest("test", () {
170 throw new TestFailure('oh no'); 165 throw new TestFailure('oh no');
171 }).load(suite); 166 }).load(suite);
172 167
173 _expectSingleFailure(liveTest); 168 expectSingleFailure(liveTest);
174 return liveTest.run(); 169 return liveTest.run();
175 }); 170 });
176 171
177 test("a synchronous reported failure causes the test to fail", () { 172 test("a synchronous reported failure causes the test to fail", () {
178 var liveTest = new LocalTest("test", () { 173 var liveTest = new LocalTest("test", () {
179 Invoker.current.handleError(new TestFailure("oh no")); 174 Invoker.current.handleError(new TestFailure("oh no"));
180 }).load(suite); 175 }).load(suite);
181 176
182 _expectSingleFailure(liveTest); 177 expectSingleFailure(liveTest);
183 return liveTest.run(); 178 return liveTest.run();
184 }); 179 });
185 180
186 test("a failure reported asynchronously during the test causes it to fail", 181 test("a failure reported asynchronously during the test causes it to fail",
187 () { 182 () {
188 var liveTest = new LocalTest("test", () { 183 var liveTest = new LocalTest("test", () {
189 Invoker.current.addOutstandingCallback(); 184 Invoker.current.addOutstandingCallback();
190 new Future(() => Invoker.current.handleError(new TestFailure("oh no"))); 185 new Future(() => Invoker.current.handleError(new TestFailure("oh no")));
191 }).load(suite); 186 }).load(suite);
192 187
193 _expectSingleFailure(liveTest); 188 expectSingleFailure(liveTest);
194 return liveTest.run(); 189 return liveTest.run();
195 }); 190 });
196 191
197 test("a failure thrown asynchronously during the test causes it to fail", 192 test("a failure thrown asynchronously during the test causes it to fail",
198 () { 193 () {
199 var liveTest = new LocalTest("test", () { 194 var liveTest = new LocalTest("test", () {
200 Invoker.current.addOutstandingCallback(); 195 Invoker.current.addOutstandingCallback();
201 new Future(() => throw new TestFailure("oh no")); 196 new Future(() => throw new TestFailure("oh no"));
202 }).load(suite); 197 }).load(suite);
203 198
204 _expectSingleFailure(liveTest); 199 expectSingleFailure(liveTest);
205 return liveTest.run(); 200 return liveTest.run();
206 }); 201 });
207 202
208 test("a failure reported asynchronously after the test causes it to error", 203 test("a failure reported asynchronously after the test causes it to error",
209 () { 204 () {
210 var liveTest = new LocalTest("test", () { 205 var liveTest = new LocalTest("test", () {
211 new Future(() => Invoker.current.handleError(new TestFailure("oh no"))); 206 new Future(() => Invoker.current.handleError(new TestFailure("oh no")));
212 }).load(suite); 207 }).load(suite);
213 208
214 _expectStates(liveTest, [ 209 expectStates(liveTest, [
215 const State(Status.running, Result.success), 210 const State(Status.running, Result.success),
216 const State(Status.complete, Result.success), 211 const State(Status.complete, Result.success),
217 const State(Status.complete, Result.failure), 212 const State(Status.complete, Result.failure),
218 const State(Status.complete, Result.error) 213 const State(Status.complete, Result.error)
219 ]); 214 ]);
220 215
221 _expectErrors(liveTest, [(error) { 216 expectErrors(liveTest, [(error) {
222 expect(_lastState, equals(const State(Status.complete, Result.failure))) ; 217 expect(lastState, equals(const State(Status.complete, Result.failure)));
223 expect(error, isTestFailure("oh no")); 218 expect(error, isTestFailure("oh no"));
224 }, (error) { 219 }, (error) {
225 expect(_lastState, equals(const State(Status.complete, Result.error))); 220 expect(lastState, equals(const State(Status.complete, Result.error)));
226 expect(error, equals( 221 expect(error, equals(
227 "This test failed after it had already completed. Make sure to " 222 "This test failed after it had already completed. Make sure to "
228 "use [expectAsync]\n" 223 "use [expectAsync]\n"
229 "or the [completes] matcher when testing async code.")); 224 "or the [completes] matcher when testing async code."));
230 }]); 225 }]);
231 226
232 return liveTest.run(); 227 return liveTest.run();
233 }); 228 });
234 229
235 test("multiple asynchronous failures are reported", () { 230 test("multiple asynchronous failures are reported", () {
236 var liveTest = new LocalTest("test", () { 231 var liveTest = new LocalTest("test", () {
237 Invoker.current.addOutstandingCallback(); 232 Invoker.current.addOutstandingCallback();
238 new Future(() => throw new TestFailure("one")); 233 new Future(() => throw new TestFailure("one"));
239 new Future(() => throw new TestFailure("two")); 234 new Future(() => throw new TestFailure("two"));
240 new Future(() => throw new TestFailure("three")); 235 new Future(() => throw new TestFailure("three"));
241 new Future(() => throw new TestFailure("four")); 236 new Future(() => throw new TestFailure("four"));
242 }).load(suite); 237 }).load(suite);
243 238
244 _expectStates(liveTest, [ 239 expectStates(liveTest, [
245 const State(Status.running, Result.success), 240 const State(Status.running, Result.success),
246 const State(Status.complete, Result.failure) 241 const State(Status.complete, Result.failure)
247 ]); 242 ]);
248 243
249 _expectErrors(liveTest, [(error) { 244 expectErrors(liveTest, [(error) {
250 expect(_lastState.status, equals(Status.complete)); 245 expect(lastState.status, equals(Status.complete));
251 expect(error, isTestFailure("one")); 246 expect(error, isTestFailure("one"));
252 }, (error) { 247 }, (error) {
253 expect(error, isTestFailure("two")); 248 expect(error, isTestFailure("two"));
254 }, (error) { 249 }, (error) {
255 expect(error, isTestFailure("three")); 250 expect(error, isTestFailure("three"));
256 }, (error) { 251 }, (error) {
257 expect(error, isTestFailure("four")); 252 expect(error, isTestFailure("four"));
258 }]); 253 }]);
259 254
260 return liveTest.run(); 255 return liveTest.run();
261 }); 256 });
262 257
263 test("a failure after an error doesn't change the state of the test", () { 258 test("a failure after an error doesn't change the state of the test", () {
264 var liveTest = new LocalTest("test", () { 259 var liveTest = new LocalTest("test", () {
265 new Future(() => throw new TestFailure("fail")); 260 new Future(() => throw new TestFailure("fail"));
266 throw "error"; 261 throw "error";
267 }).load(suite); 262 }).load(suite);
268 263
269 _expectStates(liveTest, [ 264 expectStates(liveTest, [
270 const State(Status.running, Result.success), 265 const State(Status.running, Result.success),
271 const State(Status.complete, Result.error) 266 const State(Status.complete, Result.error)
272 ]); 267 ]);
273 268
274 _expectErrors(liveTest, [(error) { 269 expectErrors(liveTest, [(error) {
275 expect(_lastState, equals(const State(Status.complete, Result.error))); 270 expect(lastState, equals(const State(Status.complete, Result.error)));
276 expect(error, equals("error")); 271 expect(error, equals("error"));
277 }, (error) { 272 }, (error) {
278 expect(error, isTestFailure("fail")); 273 expect(error, isTestFailure("fail"));
279 }]); 274 }]);
280 275
281 return liveTest.run(); 276 return liveTest.run();
282 }); 277 });
283 278
284 test("tearDown is run after an asynchronous failure", () { 279 test("tearDown is run after an asynchronous failure", () {
285 var stateDuringTearDown; 280 var stateDuringTearDown;
286 var liveTest; 281 var liveTest;
287 liveTest = new LocalTest("test", () { 282 liveTest = new LocalTest("test", () {
288 Invoker.current.addOutstandingCallback(); 283 Invoker.current.addOutstandingCallback();
289 new Future(() => throw new TestFailure("oh no")); 284 new Future(() => throw new TestFailure("oh no"));
290 }, tearDown: () { 285 }, tearDown: () {
291 stateDuringTearDown = liveTest.state; 286 stateDuringTearDown = liveTest.state;
292 }).load(suite); 287 }).load(suite);
293 288
294 _expectSingleFailure(liveTest); 289 expectSingleFailure(liveTest);
295 return liveTest.run().then((_) { 290 return liveTest.run().then((_) {
296 expect(stateDuringTearDown, 291 expect(stateDuringTearDown,
297 equals(const State(Status.complete, Result.failure))); 292 equals(const State(Status.complete, Result.failure)));
298 }); 293 });
299 }); 294 });
300 }); 295 });
301 296
302 group("in a test with errors,", () { 297 group("in a test with errors,", () {
303 test("a synchronous throw is reported and causes the test to error", () { 298 test("a synchronous throw is reported and causes the test to error", () {
304 var liveTest = new LocalTest("test", () { 299 var liveTest = new LocalTest("test", () {
305 throw 'oh no'; 300 throw 'oh no';
306 }).load(suite); 301 }).load(suite);
307 302
308 _expectSingleError(liveTest); 303 expectSingleError(liveTest);
309 return liveTest.run(); 304 return liveTest.run();
310 }); 305 });
311 306
312 test("a synchronous reported error causes the test to error", () { 307 test("a synchronous reported error causes the test to error", () {
313 var liveTest = new LocalTest("test", () { 308 var liveTest = new LocalTest("test", () {
314 Invoker.current.handleError("oh no"); 309 Invoker.current.handleError("oh no");
315 }).load(suite); 310 }).load(suite);
316 311
317 _expectSingleError(liveTest); 312 expectSingleError(liveTest);
318 return liveTest.run(); 313 return liveTest.run();
319 }); 314 });
320 315
321 test("an error reported asynchronously during the test causes it to error", 316 test("an error reported asynchronously during the test causes it to error",
322 () { 317 () {
323 var liveTest = new LocalTest("test", () { 318 var liveTest = new LocalTest("test", () {
324 Invoker.current.addOutstandingCallback(); 319 Invoker.current.addOutstandingCallback();
325 new Future(() => Invoker.current.handleError("oh no")); 320 new Future(() => Invoker.current.handleError("oh no"));
326 }).load(suite); 321 }).load(suite);
327 322
328 _expectSingleError(liveTest); 323 expectSingleError(liveTest);
329 return liveTest.run(); 324 return liveTest.run();
330 }); 325 });
331 326
332 test("an error thrown asynchronously during the test causes it to error", 327 test("an error thrown asynchronously during the test causes it to error",
333 () { 328 () {
334 var liveTest = new LocalTest("test", () { 329 var liveTest = new LocalTest("test", () {
335 Invoker.current.addOutstandingCallback(); 330 Invoker.current.addOutstandingCallback();
336 new Future(() => throw "oh no"); 331 new Future(() => throw "oh no");
337 }).load(suite); 332 }).load(suite);
338 333
339 _expectSingleError(liveTest); 334 expectSingleError(liveTest);
340 return liveTest.run(); 335 return liveTest.run();
341 }); 336 });
342 337
343 test("an error reported asynchronously after the test causes it to error", 338 test("an error reported asynchronously after the test causes it to error",
344 () { 339 () {
345 var liveTest = new LocalTest("test", () { 340 var liveTest = new LocalTest("test", () {
346 new Future(() => Invoker.current.handleError("oh no")); 341 new Future(() => Invoker.current.handleError("oh no"));
347 }).load(suite); 342 }).load(suite);
348 343
349 _expectStates(liveTest, [ 344 expectStates(liveTest, [
350 const State(Status.running, Result.success), 345 const State(Status.running, Result.success),
351 const State(Status.complete, Result.success), 346 const State(Status.complete, Result.success),
352 const State(Status.complete, Result.error) 347 const State(Status.complete, Result.error)
353 ]); 348 ]);
354 349
355 _expectErrors(liveTest, [(error) { 350 expectErrors(liveTest, [(error) {
356 expect(_lastState, equals(const State(Status.complete, Result.error))); 351 expect(lastState, equals(const State(Status.complete, Result.error)));
357 expect(error, equals("oh no")); 352 expect(error, equals("oh no"));
358 }, (error) { 353 }, (error) {
359 expect(error, equals( 354 expect(error, equals(
360 "This test failed after it had already completed. Make sure to " 355 "This test failed after it had already completed. Make sure to "
361 "use [expectAsync]\n" 356 "use [expectAsync]\n"
362 "or the [completes] matcher when testing async code.")); 357 "or the [completes] matcher when testing async code."));
363 }]); 358 }]);
364 359
365 return liveTest.run(); 360 return liveTest.run();
366 }); 361 });
367 362
368 test("multiple asynchronous errors are reported", () { 363 test("multiple asynchronous errors are reported", () {
369 var liveTest = new LocalTest("test", () { 364 var liveTest = new LocalTest("test", () {
370 Invoker.current.addOutstandingCallback(); 365 Invoker.current.addOutstandingCallback();
371 new Future(() => throw "one"); 366 new Future(() => throw "one");
372 new Future(() => throw "two"); 367 new Future(() => throw "two");
373 new Future(() => throw "three"); 368 new Future(() => throw "three");
374 new Future(() => throw "four"); 369 new Future(() => throw "four");
375 }).load(suite); 370 }).load(suite);
376 371
377 _expectStates(liveTest, [ 372 expectStates(liveTest, [
378 const State(Status.running, Result.success), 373 const State(Status.running, Result.success),
379 const State(Status.complete, Result.error) 374 const State(Status.complete, Result.error)
380 ]); 375 ]);
381 376
382 _expectErrors(liveTest, [(error) { 377 expectErrors(liveTest, [(error) {
383 expect(_lastState.status, equals(Status.complete)); 378 expect(lastState.status, equals(Status.complete));
384 expect(error, equals("one")); 379 expect(error, equals("one"));
385 }, (error) { 380 }, (error) {
386 expect(error, equals("two")); 381 expect(error, equals("two"));
387 }, (error) { 382 }, (error) {
388 expect(error, equals("three")); 383 expect(error, equals("three"));
389 }, (error) { 384 }, (error) {
390 expect(error, equals("four")); 385 expect(error, equals("four"));
391 }]); 386 }]);
392 387
393 return liveTest.run(); 388 return liveTest.run();
394 }); 389 });
395 390
396 test("an error after a failure changes the state of the test", () { 391 test("an error after a failure changes the state of the test", () {
397 var liveTest = new LocalTest("test", () { 392 var liveTest = new LocalTest("test", () {
398 new Future(() => throw "error"); 393 new Future(() => throw "error");
399 throw new TestFailure("fail"); 394 throw new TestFailure("fail");
400 }).load(suite); 395 }).load(suite);
401 396
402 _expectStates(liveTest, [ 397 expectStates(liveTest, [
403 const State(Status.running, Result.success), 398 const State(Status.running, Result.success),
404 const State(Status.complete, Result.failure), 399 const State(Status.complete, Result.failure),
405 const State(Status.complete, Result.error) 400 const State(Status.complete, Result.error)
406 ]); 401 ]);
407 402
408 _expectErrors(liveTest, [(error) { 403 expectErrors(liveTest, [(error) {
409 expect(_lastState, equals(const State(Status.complete, Result.failure))) ; 404 expect(lastState, equals(const State(Status.complete, Result.failure)));
410 expect(error, isTestFailure("fail")); 405 expect(error, isTestFailure("fail"));
411 }, (error) { 406 }, (error) {
412 expect(_lastState, equals(const State(Status.complete, Result.error))); 407 expect(lastState, equals(const State(Status.complete, Result.error)));
413 expect(error, equals("error")); 408 expect(error, equals("error"));
414 }]); 409 }]);
415 410
416 return liveTest.run(); 411 return liveTest.run();
417 }); 412 });
418 413
419 test("tearDown is run after an asynchronous error", () { 414 test("tearDown is run after an asynchronous error", () {
420 var stateDuringTearDown; 415 var stateDuringTearDown;
421 var liveTest; 416 var liveTest;
422 liveTest = new LocalTest("test", () { 417 liveTest = new LocalTest("test", () {
423 Invoker.current.addOutstandingCallback(); 418 Invoker.current.addOutstandingCallback();
424 new Future(() => throw "oh no"); 419 new Future(() => throw "oh no");
425 }, tearDown: () { 420 }, tearDown: () {
426 stateDuringTearDown = liveTest.state; 421 stateDuringTearDown = liveTest.state;
427 }).load(suite); 422 }).load(suite);
428 423
429 _expectSingleError(liveTest); 424 expectSingleError(liveTest);
430 return liveTest.run().then((_) { 425 return liveTest.run().then((_) {
431 expect(stateDuringTearDown, 426 expect(stateDuringTearDown,
432 equals(const State(Status.complete, Result.error))); 427 equals(const State(Status.complete, Result.error)));
433 }); 428 });
434 }); 429 });
435 }); 430 });
436 431
437 test("a test doesn't complete until there are no outstanding callbacks", 432 test("a test doesn't complete until there are no outstanding callbacks",
438 () { 433 () {
439 var outstandingCallbackRemoved = false; 434 var outstandingCallbackRemoved = false;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
475 expect(outstandingCallbackRemovedBeforeTeardown, isTrue); 470 expect(outstandingCallbackRemovedBeforeTeardown, isTrue);
476 }); 471 });
477 }); 472 });
478 473
479 test("a test times out after 30 seconds", () { 474 test("a test times out after 30 seconds", () {
480 new FakeAsync().run((async) { 475 new FakeAsync().run((async) {
481 var liveTest = new LocalTest("test", () { 476 var liveTest = new LocalTest("test", () {
482 Invoker.current.addOutstandingCallback(); 477 Invoker.current.addOutstandingCallback();
483 }).load(suite); 478 }).load(suite);
484 479
485 _expectStates(liveTest, [ 480 expectStates(liveTest, [
486 const State(Status.running, Result.success), 481 const State(Status.running, Result.success),
487 const State(Status.complete, Result.error) 482 const State(Status.complete, Result.error)
488 ]); 483 ]);
489 484
490 _expectErrors(liveTest, [(error) { 485 expectErrors(liveTest, [(error) {
491 expect(_lastState.status, equals(Status.complete)); 486 expect(lastState.status, equals(Status.complete));
492 expect(error, new isInstanceOf<TimeoutException>()); 487 expect(error, new isInstanceOf<TimeoutException>());
493 }]); 488 }]);
494 489
495 liveTest.run(); 490 liveTest.run();
496 async.elapse(new Duration(seconds: 30)); 491 async.elapse(new Duration(seconds: 30));
497 }); 492 });
498 }); 493 });
499 } 494 }
500
501 /// Asserts that exactly [states] will be emitted via [liveTest.onStateChange].
502 ///
503 /// The most recent emitted state is stored in [_lastState].
504 void _expectStates(LiveTest liveTest, Iterable<State> statesIter) {
505 var states = new Queue.from(statesIter);
506 liveTest.onStateChange.listen(expectAsync((state) {
507 _lastState = state;
508 expect(state, equals(states.removeFirst()));
509 }, count: states.length, max: states.length));
510 }
511
512 /// Asserts that errors will be emitted via [liveTest.onError] that match
513 /// [validators], in order.
514 void _expectErrors(LiveTest liveTest, Iterable<Function> validatorsIter) {
515 var validators = new Queue.from(validatorsIter);
516 liveTest.onError.listen(expectAsync((error) {
517 validators.removeFirst()(error.error);
518 }, count: validators.length, max: validators.length));
519 }
520
521 /// Asserts that [liveTest] will have a single failure with message `"oh no"`.
522 void _expectSingleFailure(LiveTest liveTest) {
523 _expectStates(liveTest, [
524 const State(Status.running, Result.success),
525 const State(Status.complete, Result.failure)
526 ]);
527
528 _expectErrors(liveTest, [(error) {
529 expect(_lastState.status, equals(Status.complete));
530 expect(error, isTestFailure("oh no"));
531 }]);
532 }
533
534 /// Asserts that [liveTest] will have a single error, the string `"oh no"`.
535 void _expectSingleError(LiveTest liveTest) {
536 _expectStates(liveTest, [
537 const State(Status.running, Result.success),
538 const State(Status.complete, Result.error)
539 ]);
540
541 _expectErrors(liveTest, [(error) {
542 expect(_lastState.status, equals(Status.complete));
543 expect(error, equals("oh no"));
544 }]);
545 }
OLDNEW
« no previous file with comments | « lib/src/vm_listener.dart ('k') | test/utils.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698