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 testrunner_test; | |
6 | |
7 import 'dart:async'; | |
8 import 'dart:io'; | |
9 import 'package:unittest/unittest.dart'; | |
10 | |
11 var dart; | |
12 var debug = false; | |
13 | |
14 Future runTestrunner( | |
15 command, List<String> args, List<String> stdout, List<String> stderr) { | |
16 if (debug) { | |
17 print("Running $command ${args.join(' ')}"); | |
18 } | |
19 return Process.run(command, args).then((ProcessResult result) { | |
20 var lineEndings = new RegExp("\r\n|\n"); | |
21 stdout.addAll(result.stdout.trim().split(lineEndings)); | |
22 stderr.addAll(result.stderr.trim().split(lineEndings)); | |
23 }).catchError((e) { | |
24 stderr.add("Error starting process:"); | |
25 stderr.add(" Command: $command"); | |
26 stderr.add(" Error: ${e}"); | |
27 completer.complete(-1); | |
28 }); | |
29 } | |
30 | |
31 // Useful utility for debugging test failures. | |
32 void dump(label, list) { | |
33 if (!debug) return; | |
34 print('\n@=[ $label ]=============================\n'); | |
35 for (var i = 0; i < list.length; i++) { | |
36 print('@ ${list[i]}\n'); | |
37 } | |
38 print('------------------------------------------\n'); | |
39 } | |
40 | |
41 int stringCompare(String s1, String s2) => s1.compareTo(s2); | |
42 | |
43 Future runTest(List<String> args, List<String> expected_stdout, | |
44 {List<String> expected_stderr, sort: false}) { | |
45 var stdout = new List<String>(); | |
46 var stderr = new List<String>(); | |
47 for (var i = 0; i < expected_stdout.length; i++) { | |
48 expected_stdout[i] = | |
49 expected_stdout[i].replaceAll('/', Platform.pathSeparator); | |
50 } | |
51 if (debug) { | |
52 args.insert(1, "--log=stderr"); | |
53 } | |
54 var rtn = runTestrunner(dart, args, stdout, stderr); | |
55 rtn.then((_) { | |
56 dump('stderr', stderr); | |
57 dump('stdout', stdout); | |
58 | |
59 if (expected_stderr != null) { | |
60 expect(stderr.length, orderedEquals(expected_stderr)); | |
61 } | |
62 var i, l = 0, matched = 0; | |
63 if (sort) { | |
64 stdout.sort(stringCompare); | |
65 expected_stdout.sort(stringCompare); | |
66 } | |
67 for (i = 0; i < stdout.length; i++) { | |
68 if (!stdout[i].startsWith('@')) { | |
69 if (expected_stdout.length <= l) { | |
70 fail("Extra text in output: ${stdout[i]}"); | |
71 return; | |
72 } | |
73 var actual = stdout[i].trim(); | |
74 if (debug) { | |
75 print("Compare <$actual> and <${expected_stdout[l]}>"); | |
76 } | |
77 if (expected_stdout[l].startsWith('*')) { | |
78 expect(actual, endsWith(expected_stdout[l].substring(1))); | |
79 } else if (expected_stdout[l].startsWith('?')) { | |
80 var pat = expected_stdout[l].substring(1); | |
81 if (Platform.operatingSystem == 'windows') { | |
82 // The joys of Windows... | |
83 pat = pat.replaceAll('\\', '\\\\'); | |
84 } | |
85 expect(actual, matches(pat)); | |
86 } else { | |
87 expect(actual, expected_stdout[l]); | |
88 } | |
89 ++l; | |
90 } | |
91 } | |
92 if (l < expected_stdout.length) { | |
93 fail("Only matched $l of ${expected_stdout.length} lines"); | |
94 } | |
95 }); | |
96 return rtn; | |
97 } | |
98 | |
99 // A useful function to quickly disable a group of tests; just | |
100 // replace group() with skip_group(). | |
101 skip_group(_1, _2) {} | |
102 | |
103 main() { | |
104 dart = Platform.executable; | |
105 var idx = dart.indexOf('dart-sdk'); | |
106 if (idx < 0) { | |
107 print("Please run using the dart executable from the Dart SDK"); | |
108 exit(-1); | |
109 } | |
110 var _ = Platform.pathSeparator; | |
111 var testrunner = '../../testrunner/testrunner.dart' | |
112 .replaceAll('/', Platform.pathSeparator); | |
113 | |
114 group("list tests", () { | |
115 test('list file', () { | |
116 return runTest([testrunner, '--list-files', 'non_browser_tests'], | |
117 ['?.*/non_browser_tests/non_browser_test.dart']); | |
118 }); | |
119 test('list files', () { | |
120 return runTest([ | |
121 testrunner, | |
122 '--recurse', | |
123 '--sort', | |
124 '--list-files', | |
125 '--test-file-pattern=.dart\$' | |
126 ], [ | |
127 '*browser_tests/web/browser_test.dart', | |
128 '*http_client_tests/http_client_test.dart', | |
129 '*layout_tests/web/layout_test.dart', | |
130 '*non_browser_tests/non_browser_test.dart', | |
131 '*non_browser_tests/non_browser_toast.dart', | |
132 '*/testrunner_test.dart' | |
133 ]); | |
134 }); | |
135 test('list files', () { | |
136 return runTest([ | |
137 testrunner, | |
138 '--list-files', | |
139 '--test-file-pattern=.dart\$', | |
140 'non_browser_tests' | |
141 ], [ | |
142 '*non_browser_tests/non_browser_test.dart', | |
143 '*non_browser_tests/non_browser_toast.dart' | |
144 ], sort: true); | |
145 }); | |
146 test('list groups', () { | |
147 return runTest([ | |
148 testrunner, | |
149 '--list-groups', | |
150 'non_browser_tests' | |
151 ], [ | |
152 '*non_browser_tests/non_browser_test.dart group1', | |
153 '*non_browser_tests/non_browser_test.dart group2' | |
154 ]); | |
155 }); | |
156 test('list tests', () { | |
157 return runTest([ | |
158 testrunner, | |
159 '--list-tests', | |
160 'non_browser_tests' | |
161 ], [ | |
162 '*non_browser_tests/non_browser_test.dart group1 test1', | |
163 '*non_browser_tests/non_browser_test.dart group2 test2' | |
164 ]); | |
165 }); | |
166 }); | |
167 | |
168 group("vm", () { | |
169 test("vm without timing info", () { | |
170 return runTest([ | |
171 testrunner, | |
172 '--recurse', | |
173 'non_browser_tests' | |
174 ], [ | |
175 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1' | |
176 ' Expected: false', | |
177 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' | |
178 ]); | |
179 }); | |
180 | |
181 test("vm with timing info", () { | |
182 return runTest([ | |
183 testrunner, | |
184 '--recurse', | |
185 '--time', | |
186 'non_browser_tests' | |
187 ], [ | |
188 '?FAIL [0-9.]+s .*/non_browser_tests/non_browser_test.dart group1' | |
189 ' test1 Expected: false', | |
190 '?PASS [0-9.]+s .*/non_browser_tests/non_browser_test.dart group2' | |
191 ' test2' | |
192 ]); | |
193 }); | |
194 }); | |
195 | |
196 group("selection", () { | |
197 test("--include", () { | |
198 return runTest([ | |
199 testrunner, | |
200 '--recurse', | |
201 '--include=group1', | |
202 'non_browser_tests' | |
203 ], [ | |
204 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' | |
205 'Expected: false' | |
206 ]); | |
207 }); | |
208 | |
209 test("--exclude", () { | |
210 return runTest( | |
211 [testrunner, '--recurse', '--exclude=group1', 'non_browser_tests'], | |
212 ['?PASS .*/non_browser_tests/non_browser_test.dart group2 test2']); | |
213 }); | |
214 | |
215 test("test file pattern", () { | |
216 return runTest([ | |
217 testrunner, | |
218 '--recurse', | |
219 '--test-file-pattern=toast', | |
220 'non_browser_tests' | |
221 ], [ | |
222 '?PASS .*/non_browser_tests/non_browser_toast.dart foo bar' | |
223 ]); | |
224 }); | |
225 }); | |
226 | |
227 group("stop on failure tests", () { | |
228 test("without stop", () { | |
229 return runTest([ | |
230 testrunner, | |
231 '--recurse', | |
232 '--sort', | |
233 '--tasks=1', | |
234 '--test-file-pattern=.dart\$', | |
235 'non_browser_tests' | |
236 ], [ | |
237 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' | |
238 'Expected: false', | |
239 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2', | |
240 '?PASS .*/non_browser_tests/non_browser_toast.dart foo bar' | |
241 ]); | |
242 }); | |
243 test("with stop", () { | |
244 return runTest([ | |
245 testrunner, | |
246 '--recurse', | |
247 '--sort', | |
248 '--tasks=1', | |
249 '--test-file-pattern=.dart\$', | |
250 '--stop-on-failure', | |
251 'non_browser_tests' | |
252 ], [ | |
253 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' | |
254 'Expected: false', | |
255 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' | |
256 ]); | |
257 }); | |
258 }); | |
259 | |
260 group("output control", () { | |
261 test("summary test", () { | |
262 return runTest([ | |
263 testrunner, | |
264 '--recurse', | |
265 '--summary', | |
266 'non_browser_tests' | |
267 ], [ | |
268 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' | |
269 'Expected: false', | |
270 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2', | |
271 '', | |
272 '?.*/non_browser_tests/non_browser_test.dart: ' | |
273 '1 PASSED, 1 FAILED, 0 ERRORS' | |
274 ]); | |
275 }); | |
276 | |
277 test('list tests with custom format', () { | |
278 return runTest([ | |
279 testrunner, | |
280 '--list-tests', | |
281 '--list-format="<FILENAME><TESTNAME>"', | |
282 'non_browser_tests' | |
283 ], [ | |
284 '?.*/non_browser_tests/non_browser_test.dart test1', | |
285 '?.*/non_browser_tests/non_browser_test.dart test2' | |
286 ]); | |
287 }); | |
288 | |
289 test("custom message formatting", () { | |
290 return runTest([ | |
291 testrunner, | |
292 '--recurse', | |
293 '--pass-format=YIPPEE! <GROUPNAME><TESTNAME>', | |
294 '--fail-format=EPIC FAIL! <GROUPNAME><TESTNAME>', | |
295 'non_browser_tests' | |
296 ], [ | |
297 'EPIC FAIL! group1 test1', | |
298 'YIPPEE! group2 test2' | |
299 ]); | |
300 }); | |
301 }); | |
302 | |
303 test("checked mode test", () { | |
304 return runTest([ | |
305 testrunner, | |
306 '--recurse', | |
307 '--checked', | |
308 'non_browser_tests' | |
309 ], [ | |
310 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' | |
311 'Expected: false', | |
312 "?FAIL .*/non_browser_tests/non_browser_test.dart group2 test2 " | |
313 "Caught type 'int' is not a subtype of type 'bool' of 'x'." | |
314 ]); | |
315 }); | |
316 | |
317 group("browser", () { | |
318 test("native test", () { | |
319 return runTest([ | |
320 testrunner, | |
321 '--recurse', | |
322 '--runtime=drt-dart', | |
323 'browser_tests' | |
324 ], [ | |
325 '?FAIL .*/browser_tests/web/browser_test.dart group1 test1 ' | |
326 'Expected: false', | |
327 '?PASS .*/browser_tests/web/browser_test.dart group2 test2' | |
328 ]); | |
329 }); | |
330 | |
331 test("compiled test", () { | |
332 return runTest([ | |
333 testrunner, | |
334 '--recurse', | |
335 '--runtime=drt-js', | |
336 'browser_tests' | |
337 ], [ | |
338 '?FAIL .*/browser_tests/web/browser_test.dart group1 test1 ' | |
339 'Expected: false', | |
340 '?PASS .*/browser_tests/web/browser_test.dart group2 test2' | |
341 ]); | |
342 }); | |
343 }); | |
344 | |
345 group("textual layout tests", () { | |
346 group("drt-dart", () { | |
347 test("no baseline", () { | |
348 var f = new File("layout_tests/web/layout_test/layout.txt"); | |
349 if (f.existsSync()) { | |
350 f.deleteSync(); | |
351 } | |
352 return runTest([ | |
353 testrunner, | |
354 '--runtime=drt-dart', | |
355 '--recurse', | |
356 '--layout-text', | |
357 'layout_tests' | |
358 ], [ | |
359 '?FAIL .*/layout_tests/web/layout_test.dart layout ' | |
360 'No expectation file' | |
361 ]); | |
362 }); | |
363 test("create baseline", () { | |
364 return runTest([ | |
365 testrunner, | |
366 '--runtime=drt-dart', | |
367 '--recurse', | |
368 '--layout-text', | |
369 '--regenerate', | |
370 'layout_tests' | |
371 ], [ | |
372 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
373 ]); | |
374 }); | |
375 test("test baseline", () { | |
376 return runTest([ | |
377 testrunner, | |
378 '--runtime=drt-dart', | |
379 '--recurse', | |
380 '--layout-text', | |
381 'layout_tests' | |
382 ], [ | |
383 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
384 ]); | |
385 }); | |
386 }); | |
387 group("drt-js", () { | |
388 test("no baseline", () { | |
389 var f = new File("layout_tests/web/layout_test/layout.txt"); | |
390 if (f.existsSync()) { | |
391 f.deleteSync(); | |
392 } | |
393 return runTest([ | |
394 testrunner, | |
395 '--runtime=drt-js', | |
396 '--recurse', | |
397 '--layout-text', | |
398 'layout_tests' | |
399 ], [ | |
400 '?FAIL .*/layout_tests/web/layout_test.dart layout ' | |
401 'No expectation file' | |
402 ]); | |
403 }); | |
404 test("create baseline", () { | |
405 return runTest([ | |
406 testrunner, | |
407 '--runtime=drt-js', | |
408 '--recurse', | |
409 '--layout-text', | |
410 '--regenerate', | |
411 'layout_tests' | |
412 ], [ | |
413 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
414 ]); | |
415 }); | |
416 test("test baseline", () { | |
417 return runTest([ | |
418 testrunner, | |
419 '--runtime=drt-js', | |
420 '--recurse', | |
421 '--layout-text', | |
422 'layout_tests' | |
423 ], [ | |
424 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
425 ]); | |
426 }); | |
427 }); | |
428 }); | |
429 | |
430 group("pixel layout tests", () { | |
431 group("drt-dart", () { | |
432 test("no baseline", () { | |
433 var f = new File("layout_tests/web/layout_test/layout.png"); | |
434 if (f.existsSync()) { | |
435 f.deleteSync(); | |
436 } | |
437 return runTest([ | |
438 testrunner, | |
439 '--runtime=drt-dart', | |
440 '--recurse', | |
441 '--layout-pixel', | |
442 'layout_tests' | |
443 ], [ | |
444 '?FAIL .*/layout_tests/web/layout_test.dart layout ' | |
445 'No expectation file' | |
446 ]); | |
447 }); | |
448 test("create baseline", () { | |
449 return runTest([ | |
450 testrunner, | |
451 '--runtime=drt-dart', | |
452 '--recurse', | |
453 '--layout-pixel', | |
454 '--regenerate', | |
455 'layout_tests' | |
456 ], [ | |
457 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
458 ]); | |
459 }); | |
460 test("test baseline", () { | |
461 return runTest([ | |
462 testrunner, | |
463 '--runtime=drt-dart', | |
464 '--recurse', | |
465 '--layout-pixel', | |
466 'layout_tests' | |
467 ], [ | |
468 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
469 ]); | |
470 }); | |
471 // TODO(gram): Should add a test that changes a byte of the | |
472 // expectation .png. | |
473 }); | |
474 group("drt-js", () { | |
475 test("no baseline", () { | |
476 var f = new File("layout_tests/web/layout_test/layout.png"); | |
477 if (f.existsSync()) { | |
478 f.deleteSync(); | |
479 } | |
480 return runTest([ | |
481 testrunner, | |
482 '--runtime=drt-js', | |
483 '--recurse', | |
484 '--layout-pixel', | |
485 'layout_tests' | |
486 ], [ | |
487 '?FAIL .*/layout_tests/web/layout_test.dart layout ' | |
488 'No expectation file' | |
489 ]); | |
490 }); | |
491 test("create baseline", () { | |
492 return runTest([ | |
493 testrunner, | |
494 '--runtime=drt-js', | |
495 '--recurse', | |
496 '--layout-pixel', | |
497 '--regenerate', | |
498 'layout_tests' | |
499 ], [ | |
500 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
501 ]); | |
502 }); | |
503 test("test baseline", () { | |
504 return runTest([ | |
505 testrunner, | |
506 '--runtime=drt-js', | |
507 '--recurse', | |
508 '--layout-pixel', | |
509 'layout_tests' | |
510 ], [ | |
511 '?PASS .*/layout_tests/web/layout_test.dart layout' | |
512 ]); | |
513 }); | |
514 }); | |
515 }); | |
516 | |
517 group("run in isolate", () { | |
518 test("vm", () { | |
519 return runTest([ | |
520 testrunner, | |
521 '--runtime=vm', | |
522 '--recurse', | |
523 '--isolate', | |
524 'non_browser_tests' | |
525 ], [ | |
526 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1' | |
527 ' Expected: false', | |
528 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' | |
529 ]); | |
530 }); | |
531 test("drt-dart", () { | |
532 return runTest([ | |
533 testrunner, | |
534 '--runtime=drt-dart', | |
535 '--recurse', | |
536 '--isolate', | |
537 'non_browser_tests' | |
538 ], [ | |
539 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1' | |
540 ' Expected: false', | |
541 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' | |
542 ]); | |
543 }); | |
544 test("drt-js", () { | |
545 return runTest([ | |
546 testrunner, | |
547 '--runtime=drt-js', | |
548 '--recurse', | |
549 '--isolate', | |
550 'non_browser_tests' | |
551 ], [ | |
552 '?FAIL .*/non_browser_tests/non_browser_test.dart group1 test1 ' | |
553 'Expected: false', | |
554 '?PASS .*/non_browser_tests/non_browser_test.dart group2 test2' | |
555 ]); | |
556 }); | |
557 }); | |
558 | |
559 group("embedded server", () { | |
560 test("get test", () { | |
561 return runTest([ | |
562 testrunner, | |
563 '--recurse', | |
564 '--server', | |
565 '--port=3456', | |
566 '--root=${Directory.current.path}', | |
567 'http_client_tests' | |
568 ], [ | |
569 '?PASS .*/http_client_tests/http_client_test.dart test1', | |
570 '?PASS .*/http_client_tests/http_client_test.dart test2' | |
571 ]); | |
572 }); | |
573 }); | |
574 } | |
OLD | NEW |