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 // 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 |
OLD | NEW |