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

Side by Side Diff: utils/tests/testrunner/testrunner_test.dart

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

Powered by Google App Engine
This is Rietveld 408576698