| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 /** | 5 /** |
| 6 * Classes and methods for enumerating and preparing tests. | 6 * Classes and methods for enumerating and preparing tests. |
| 7 * | 7 * |
| 8 * This library includes: | 8 * This library includes: |
| 9 * | 9 * |
| 10 * - Creating tests by listing all the Dart files in certain directories, | 10 * - Creating tests by listing all the Dart files in certain directories, |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 | 218 |
| 219 bool listRecursively() => false; | 219 bool listRecursively() => false; |
| 220 | 220 |
| 221 String shellPath() => TestUtils.dartShellFileName(configuration); | 221 String shellPath() => TestUtils.dartShellFileName(configuration); |
| 222 | 222 |
| 223 List<String> additionalOptions(String filename) => []; | 223 List<String> additionalOptions(String filename) => []; |
| 224 | 224 |
| 225 void forEachTest(Function onTest, Map testCache, String globalTempDir(), | 225 void forEachTest(Function onTest, Map testCache, String globalTempDir(), |
| 226 [Function onDone = null]) { | 226 [Function onDone = null]) { |
| 227 // If DumpRenderTree is required, and not yet updated, wait for update. | 227 // If DumpRenderTree is required, and not yet updated, wait for update. |
| 228 if (DumpRenderTreeUpdater.componentRequiresDRT(configuration['component']) | 228 if (configuration['runtime'] == 'drt' && !DumpRenderTreeUpdater.updated) { |
| 229 && !DumpRenderTreeUpdater.updated) { | |
| 230 Expect.isTrue(DumpRenderTreeUpdater.isActive); | 229 Expect.isTrue(DumpRenderTreeUpdater.isActive); |
| 231 DumpRenderTreeUpdater.onUpdated.add(() { | 230 DumpRenderTreeUpdater.onUpdated.add(() { |
| 232 forEachTest(onTest, testCache, globalTempDir, onDone); | 231 forEachTest(onTest, testCache, globalTempDir, onDone); |
| 233 }); | 232 }); |
| 234 return; | 233 return; |
| 235 } | 234 } |
| 236 | 235 |
| 237 doTest = onTest; | 236 doTest = onTest; |
| 238 doDone = (onDone != null) ? onDone : (() => null); | 237 doDone = (onDone != null) ? onDone : (() => null); |
| 239 globalTemporaryDirectory = globalTempDir; | 238 globalTemporaryDirectory = globalTempDir; |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 315 // find tests in weird ways (testing that they contain "#"). | 314 // find tests in weird ways (testing that they contain "#"). |
| 316 // They need to be redone. | 315 // They need to be redone. |
| 317 // TODO(1058): This does not work on Windows. | 316 // TODO(1058): This does not work on Windows. |
| 318 start = filename.indexOf(directoryPath); | 317 start = filename.indexOf(directoryPath); |
| 319 if (start != -1) { | 318 if (start != -1) { |
| 320 testName = filename.substring(start + directoryPath.length + 1); | 319 testName = filename.substring(start + directoryPath.length + 1); |
| 321 } else { | 320 } else { |
| 322 testName = filename; | 321 testName = filename; |
| 323 } | 322 } |
| 324 | 323 |
| 325 if (configuration['component'] != 'dartc') { | 324 if (configuration['compiler'] != 'dartc') { |
| 326 if (testName.endsWith('.dart')) { | 325 if (testName.endsWith('.dart')) { |
| 327 testName = testName.substring(0, testName.length - 5); | 326 testName = testName.substring(0, testName.length - 5); |
| 328 } | 327 } |
| 329 } | 328 } |
| 330 } | 329 } |
| 331 Set<String> expectations = testExpectations.expectations(testName); | 330 Set<String> expectations = testExpectations.expectations(testName); |
| 332 if (configuration['report']) { | 331 if (configuration['report']) { |
| 333 // Tests with multiple VMOptions are counted more than once. | 332 // Tests with multiple VMOptions are counted more than once. |
| 334 for (var dummy in optionsFromFile["vmOptions"]) { | 333 for (var dummy in optionsFromFile["vmOptions"]) { |
| 335 SummaryReport.add(expectations); | 334 SummaryReport.add(expectations); |
| 336 } | 335 } |
| 337 } | 336 } |
| 338 if (expectations.contains(SKIP)) return; | 337 if (expectations.contains(SKIP)) return; |
| 339 | 338 |
| 340 if (TestUtils.isBrowserComponent(configuration['component'])) { | 339 if (TestUtils.isBrowserRuntime(configuration['runtime'])) { |
| 341 enqueueBrowserTest(info, testName, expectations); | 340 enqueueBrowserTest(info, testName, expectations); |
| 342 } else { | 341 } else { |
| 343 enqueueStandardTest(info, testName, expectations); | 342 enqueueStandardTest(info, testName, expectations); |
| 344 } | 343 } |
| 345 } | 344 } |
| 346 | 345 |
| 347 void enqueueStandardTest(TestInformation info, | 346 void enqueueStandardTest(TestInformation info, |
| 348 String testName, | 347 String testName, |
| 349 Set<String> expectations) { | 348 Set<String> expectations) { |
| 350 bool isNegative = info.isNegative || | 349 bool isNegative = info.isNegative || |
| 351 (configuration['checked'] && info.isNegativeIfChecked); | 350 (configuration['checked'] && info.isNegativeIfChecked); |
| 352 | 351 |
| 353 if (configuration['component'] == 'dartc') { | 352 if (configuration['compiler'] == 'dartc') { |
| 354 // dartc can detect static type warnings by the | 353 // dartc can detect static type warnings by the |
| 355 // format of the error line | 354 // format of the error line |
| 356 if (info.hasFatalTypeErrors) { | 355 if (info.hasFatalTypeErrors) { |
| 357 isNegative = true; | 356 isNegative = true; |
| 358 } else if (info.hasRuntimeErrors) { | 357 } else if (info.hasRuntimeErrors) { |
| 359 isNegative = false; | 358 isNegative = false; |
| 360 } | 359 } |
| 361 } | 360 } |
| 362 | 361 |
| 363 var argumentLists = argumentListsFromFile(info.filename, | 362 var argumentLists = argumentListsFromFile(info.filename, |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 TestUtils.buildDir(configuration), | 410 TestUtils.buildDir(configuration), |
| 412 directoryPath, | 411 directoryPath, |
| 413 createTestCase, | 412 createTestCase, |
| 414 testGeneratorDone); | 413 testGeneratorDone); |
| 415 } else { | 414 } else { |
| 416 createTestCase(filename, optionsFromFile['isNegative']); | 415 createTestCase(filename, optionsFromFile['isNegative']); |
| 417 } | 416 } |
| 418 } | 417 } |
| 419 | 418 |
| 420 /** | 419 /** |
| 421 * The [StandardTestSuite] has support for testing components that | 420 * The [StandardTestSuite] has support for tests that |
| 422 * compile a test from Dart to Javascript, and then run the resulting | 421 * compile a test from Dart to Javascript, and then run the resulting |
| 423 * Javascript. This function creates a working directory to hold the | 422 * Javascript. This function creates a working directory to hold the |
| 424 * Javascript version of the test, and copies the appropriate framework | 423 * Javascript version of the test, and copies the appropriate framework |
| 425 * files to that directory. It creates a [BrowserTestCase], which has | 424 * files to that directory. It creates a [BrowserTestCase], which has |
| 426 * two sequential steps to be run by the [ProcessQueue when] the test is | 425 * two sequential steps to be run by the [ProcessQueue when] the test is |
| 427 * executed: a compilation | 426 * executed: a compilation |
| 428 * step and an execution step, both with the appropriate executable and | 427 * step and an execution step, both with the appropriate executable and |
| 429 * arguments. | 428 * arguments. |
| 430 */ | 429 */ |
| 431 void enqueueBrowserTest(TestInformation info, | 430 void enqueueBrowserTest(TestInformation info, |
| 432 String testName, | 431 String testName, |
| 433 Set<String> expectations) { | 432 Set<String> expectations) { |
| 434 Map optionsFromFile = info.optionsFromFile; | 433 Map optionsFromFile = info.optionsFromFile; |
| 435 String filename = info.filename; | 434 String filename = info.filename; |
| 436 if (optionsFromFile['isMultitest']) return; | 435 if (optionsFromFile['isMultitest']) return; |
| 437 bool isWebTest = optionsFromFile['containsDomImport']; | 436 bool isWebTest = optionsFromFile['containsDomImport']; |
| 438 bool isLibraryDefinition = optionsFromFile['isLibraryDefinition']; | 437 bool isLibraryDefinition = optionsFromFile['isLibraryDefinition']; |
| 439 if (!isLibraryDefinition && optionsFromFile['containsSourceOrImport']) { | 438 if (!isLibraryDefinition && optionsFromFile['containsSourceOrImport']) { |
| 440 print('Warning for $filename: Browser tests require #library ' + | 439 print('Warning for $filename: Browser tests require #library ' + |
| 441 'in any file that uses #import, #source, or #resource'); | 440 'in any file that uses #import, #source, or #resource'); |
| 442 } | 441 } |
| 443 | 442 |
| 444 final String component = configuration['component']; | 443 final String compiler = configuration['compiler']; |
| 444 final String runtime = configuration['runtime']; |
| 445 final String testPath = | 445 final String testPath = |
| 446 new File(filename).fullPathSync().replaceAll('\\', '/'); | 446 new File(filename).fullPathSync().replaceAll('\\', '/'); |
| 447 | 447 |
| 448 for (var vmOptions in optionsFromFile['vmOptions']) { | 448 for (var vmOptions in optionsFromFile['vmOptions']) { |
| 449 // Create a unique temporary directory for each set of vmOptions. | 449 // Create a unique temporary directory for each set of vmOptions. |
| 450 // TODO(dart:429): Replace separate replaceAlls with a RegExp when | 450 // TODO(dart:429): Replace separate replaceAlls with a RegExp when |
| 451 // replaceAll(RegExp, String) is implemented. | 451 // replaceAll(RegExp, String) is implemented. |
| 452 String optionsName = ''; | 452 String optionsName = ''; |
| 453 if (optionsFromFile['vmOptions'].length > 1) { | 453 if (optionsFromFile['vmOptions'].length > 1) { |
| 454 optionsName = Strings.join(vmOptions, '-').replaceAll('-','') | 454 optionsName = Strings.join(vmOptions, '-').replaceAll('-','') |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 // TODO(efortuna): this shortening of htmlFilename is a band-aid until | 492 // TODO(efortuna): this shortening of htmlFilename is a band-aid until |
| 493 // the above TODO gets fixed. Windows cannot have paths that are longer | 493 // the above TODO gets fixed. Windows cannot have paths that are longer |
| 494 // than 260 characters, and without this hack, we were running past the | 494 // than 260 characters, and without this hack, we were running past the |
| 495 // the limit. | 495 // the limit. |
| 496 String htmlFilename = getHtmlName(filename); | 496 String htmlFilename = getHtmlName(filename); |
| 497 while ('${tempDir.path}/../$htmlFilename'.length >= 260) { | 497 while ('${tempDir.path}/../$htmlFilename'.length >= 260) { |
| 498 htmlFilename = htmlFilename.substring(htmlFilename.length~/2); | 498 htmlFilename = htmlFilename.substring(htmlFilename.length~/2); |
| 499 } | 499 } |
| 500 htmlPath = '${tempDir.path}/../$htmlFilename'; | 500 htmlPath = '${tempDir.path}/../$htmlFilename'; |
| 501 } | 501 } |
| 502 final String scriptPath = (component == 'dartium') ? | 502 final String scriptPath = (compiler == 'none' && runtime == 'drt') ? |
| 503 dartWrapperFilename : compiledDartWrapperFilename; | 503 dartWrapperFilename : compiledDartWrapperFilename; |
| 504 // Create the HTML file for the test. | 504 // Create the HTML file for the test. |
| 505 RandomAccessFile htmlTest = new File(htmlPath).openSync(FileMode.WRITE); | 505 RandomAccessFile htmlTest = new File(htmlPath).openSync(FileMode.WRITE); |
| 506 String filePrefix = ''; | 506 String filePrefix = ''; |
| 507 if (new Platform().operatingSystem() == 'windows') { | 507 if (new Platform().operatingSystem() == 'windows') { |
| 508 // Firefox on Windows does not like absolute file path names that start | 508 // Firefox on Windows does not like absolute file path names that start |
| 509 // with 'C:' adding 'file:///' solves the problem. | 509 // with 'C:' adding 'file:///' solves the problem. |
| 510 filePrefix = 'file:///'; | 510 filePrefix = 'file:///'; |
| 511 } | 511 } |
| 512 htmlTest.writeStringSync(GetHtmlContents( | 512 htmlTest.writeStringSync(GetHtmlContents( |
| 513 filename, | 513 filename, |
| 514 '$filePrefix$dartDir/client/testing/unittest/test_controller.js', | 514 '$filePrefix$dartDir/client/testing/unittest/test_controller.js', |
| 515 scriptType, | 515 scriptType, |
| 516 filePrefix + scriptPath)); | 516 filePrefix + scriptPath)); |
| 517 htmlTest.closeSync(); | 517 htmlTest.closeSync(); |
| 518 | 518 |
| 519 // Construct the command(s) that compile all the inputs needed by the | 519 // Construct the command(s) that compile all the inputs needed by the |
| 520 // browser test. For dartium, this will be noop commands. | 520 // browser test. For running Dart in DRT, this will be noop commands. |
| 521 List<Command> commands = []; | 521 List<Command> commands = []; |
| 522 if (component != 'dartium') { | 522 if (compiler != 'none' && runtime == 'drt') { |
| 523 commands.add(_compileCommand( | 523 commands.add(_compileCommand( |
| 524 dartWrapperFilename, compiledDartWrapperFilename, | 524 dartWrapperFilename, compiledDartWrapperFilename, |
| 525 component, tempDir.path, vmOptions)); | 525 compiler, tempDir.path, vmOptions)); |
| 526 | 526 |
| 527 // some tests require compiling multiple input scripts. | 527 // some tests require compiling multiple input scripts. |
| 528 List<String> otherScripts = optionsFromFile['otherScripts']; | 528 List<String> otherScripts = optionsFromFile['otherScripts']; |
| 529 for (String name in otherScripts) { | 529 for (String name in otherScripts) { |
| 530 int end = filename.lastIndexOf('/'); | 530 int end = filename.lastIndexOf('/'); |
| 531 if (end == -1) { | 531 if (end == -1) { |
| 532 print('Warning: error processing "OtherScripts" of $filename.'); | 532 print('Warning: error processing "OtherScripts" of $filename.'); |
| 533 print('Skipping test ($testName).'); | 533 print('Skipping test ($testName).'); |
| 534 return; | 534 return; |
| 535 } | 535 } |
| 536 String dir = filename.substring(0, end); | 536 String dir = filename.substring(0, end); |
| 537 end = name.lastIndexOf('.dart'); | 537 end = name.lastIndexOf('.dart'); |
| 538 if (end == -1) { | 538 if (end == -1) { |
| 539 print('Warning: error processing "OtherScripts" in $filename.'); | 539 print('Warning: error processing "OtherScripts" in $filename.'); |
| 540 print('Skipping test ($testName).'); | 540 print('Skipping test ($testName).'); |
| 541 return; | 541 return; |
| 542 } | 542 } |
| 543 String compiledName = '${name.substring(0, end)}.js'; | 543 String compiledName = '${name.substring(0, end)}.js'; |
| 544 commands.add(_compileCommand( | 544 commands.add(_compileCommand( |
| 545 '$dir/$name', '${tempDir.path}/$compiledName', | 545 '$dir/$name', '${tempDir.path}/$compiledName', |
| 546 component, tempDir.path, vmOptions)); | 546 compiler, tempDir.path, vmOptions)); |
| 547 } | 547 } |
| 548 } | 548 } |
| 549 | 549 |
| 550 // Construct the command that executes the browser test | 550 // Construct the command that executes the browser test |
| 551 List<String> args; | 551 List<String> args; |
| 552 if (component == 'webdriver') { | 552 if (runtime == 'ie' || runtime == 'ff' || runtime == 'chrome' || |
| 553 runtime == 'safari' || runtime == 'opera') { |
| 553 args = ['$dartDir/tools/testing/run_selenium.py', | 554 args = ['$dartDir/tools/testing/run_selenium.py', |
| 554 '--browser=${configuration["browser"]}', | 555 '--browser=$runtime', |
| 555 '--timeout=${configuration["timeout"] - 2}', | 556 '--timeout=${configuration["timeout"] - 2}', |
| 556 '--out=$htmlPath']; | 557 '--out=$htmlPath']; |
| 557 } else { | 558 } else { |
| 558 args = [ | 559 args = [ |
| 559 '$dartDir/tools/testing/drt-trampoline.py', | 560 '$dartDir/tools/testing/drt-trampoline.py', |
| 560 dumpRenderTreeFilename, | 561 dumpRenderTreeFilename, |
| 561 '--no-timeout' | 562 '--no-timeout' |
| 562 ]; | 563 ]; |
| 563 if (component == 'dartium') { | 564 if (runtime == 'drt' && compiler == 'none') { |
| 564 var dartFlags = ['--ignore-unrecognized-flags']; | 565 var dartFlags = ['--ignore-unrecognized-flags']; |
| 565 if (configuration["checked"]) { | 566 if (configuration["checked"]) { |
| 566 dartFlags.add('--enable_asserts'); | 567 dartFlags.add('--enable_asserts'); |
| 567 dartFlags.add("--enable_type_checks"); | 568 dartFlags.add("--enable_type_checks"); |
| 568 } | 569 } |
| 569 dartFlags.addAll(vmOptions); | 570 dartFlags.addAll(vmOptions); |
| 570 args.add('--dart-flags=${Strings.join(dartFlags, " ")}'); | 571 args.add('--dart-flags=${Strings.join(dartFlags, " ")}'); |
| 571 } | 572 } |
| 572 args.add(htmlPath); | 573 args.add(htmlPath); |
| 573 } | 574 } |
| 574 commands.add(new Command('python', args)); | 575 commands.add(new Command('python', args)); |
| 575 | 576 |
| 576 // Create BrowserTestCase and queue it. | 577 // Create BrowserTestCase and queue it. |
| 577 var testCase = new BrowserTestCase(testName, commands, configuration, | 578 var testCase = new BrowserTestCase(testName, commands, configuration, |
| 578 completeHandler, expectations, optionsFromFile['isNegative']); | 579 completeHandler, expectations, optionsFromFile['isNegative']); |
| 579 doTest(testCase); | 580 doTest(testCase); |
| 580 } | 581 } |
| 581 } | 582 } |
| 582 | 583 |
| 583 /** Helper to create a compilation command for a single input file. */ | 584 /** Helper to create a compilation command for a single input file. */ |
| 584 Command _compileCommand(String inputFile, String outputFile, | 585 Command _compileCommand(String inputFile, String outputFile, |
| 585 String component, String dir, var vmOptions) { | 586 String compiler, String dir, var vmOptions) { |
| 586 String executable = TestUtils.compilerPath(configuration); | 587 String executable = TestUtils.compilerPath(configuration); |
| 587 List<String> args = TestUtils.standardOptions(configuration); | 588 List<String> args = TestUtils.standardOptions(configuration); |
| 588 switch (component) { | 589 switch (compiler) { |
| 589 case 'frogium': | 590 case 'frog': |
| 590 case 'legium': | 591 case 'frogsh': |
| 591 case 'webdriver': | 592 case 'dart2js': |
| 592 String libdir = configuration['froglib']; | 593 String libdir = '$dartDir/frog/lib'; |
| 593 if (libdir == '') { | |
| 594 libdir = '$dartDir/frog/lib'; | |
| 595 } | |
| 596 args.addAll(['--libdir=$libdir', | 594 args.addAll(['--libdir=$libdir', |
| 597 '--compile-only', | 595 '--compile-only', |
| 598 '--out=$outputFile']); | 596 '--out=$outputFile']); |
| 599 args.addAll(vmOptions); | 597 args.addAll(vmOptions); |
| 600 args.add(inputFile); | 598 args.add(inputFile); |
| 601 break; | 599 break; |
| 602 default: | 600 default: |
| 603 Expect.fail('unimplemented component $component'); | 601 Expect.fail('unimplemented compiler $compiler'); |
| 604 } | 602 } |
| 605 return new Command(executable, args); | 603 return new Command(executable, args); |
| 606 } | 604 } |
| 607 | 605 |
| 608 bool get requiresCleanTemporaryDirectory() => | 606 bool get requiresCleanTemporaryDirectory() => |
| 609 configuration['component'] == 'dartc'; | 607 configuration['compiler'] == 'dartc'; |
| 610 | 608 |
| 611 /** | 609 /** |
| 612 * Create a directory for the generated test. If a Dart language test | 610 * Create a directory for the generated test. If a Dart language test |
| 613 * needs to be run in a browser, the Dart test needs to be embedded in | 611 * needs to be run in a browser, the Dart test needs to be embedded in |
| 614 * an HTML page, with a testing framework based on scripting and DOM events. | 612 * an HTML page, with a testing framework based on scripting and DOM events. |
| 615 * These scripts and pages are written to a generated_test directory, | 613 * These scripts and pages are written to a generated_test directory, |
| 616 * usually inside the build directory of the checkout. | 614 * usually inside the build directory of the checkout. |
| 617 * | 615 * |
| 618 * Some tests, such as those using the dartc compiler, need to be run | 616 * Some tests, such as those using the dartc compiler, need to be run |
| 619 * with an empty directory as the compiler's work directory. These | 617 * with an empty directory as the compiler's work directory. These |
| 620 * tests are copied to a subdirectory of a system-provided temporary | 618 * tests are copied to a subdirectory of a system-provided temporary |
| 621 * directory, which is deleted at the end of the test run unless the | 619 * directory, which is deleted at the end of the test run unless the |
| 622 * --keep-temporary-files flag is given. | 620 * --keep-temporary-files flag is given. |
| 623 * | 621 * |
| 624 * Those tests which are already HTML web applications (web tests), with | 622 * Those tests which are already HTML web applications (web tests), with |
| 625 * resources including CSS files and HTML files, need to be compiled into | 623 * resources including CSS files and HTML files, need to be compiled into |
| 626 * a work directory where the relative URLS to the resources work. | 624 * a work directory where the relative URLS to the resources work. |
| 627 * We use a subdirectory of the build directory that is the same number | 625 * We use a subdirectory of the build directory that is the same number |
| 628 * of levels down in the checkout as the original path of the web test. | 626 * of levels down in the checkout as the original path of the web test. |
| 629 */ | 627 */ |
| 630 Directory createOutputDirectory(String testPath, String optionsName) { | 628 Directory createOutputDirectory(String testPath, String optionsName) { |
| 631 String testUniqueName = | 629 String testUniqueName = |
| 632 testPath.substring(dartDir.length + 1, testPath.length - 5); | 630 testPath.substring(dartDir.length + 1, testPath.length - 5); |
| 633 testUniqueName = testUniqueName.replaceAll('/', '_'); | 631 testUniqueName = testUniqueName.replaceAll('/', '_'); |
| 634 testUniqueName += '-$optionsName'; | 632 testUniqueName += '-$optionsName'; |
| 635 | 633 |
| 636 // Create '[build dir]/generated_tests/$component/$testUniqueName', | 634 // Create '[build dir]/generated_tests/$compiler-$runtime/$testUniqueName', |
| 637 // including any intermediate directories that don't exist. | 635 // including any intermediate directories that don't exist. |
| 638 var generatedTestPath = ['generated_tests', | 636 var generatedTestPath = ['generated_tests', |
| 639 configuration['component'], | 637 configuration['compiler'] + '-' + |
| 638 configuration['runtime'], |
| 640 testUniqueName]; | 639 testUniqueName]; |
| 641 | 640 |
| 642 String tempDirPath = TestUtils.buildDir(configuration); | 641 String tempDirPath = TestUtils.buildDir(configuration); |
| 643 if (requiresCleanTemporaryDirectory) { | 642 if (requiresCleanTemporaryDirectory) { |
| 644 tempDirPath = globalTemporaryDirectory(); | 643 tempDirPath = globalTemporaryDirectory(); |
| 645 String debugMode = | 644 String debugMode = |
| 646 (configuration['mode'] == 'debug') ? 'Debug_' : 'Release_'; | 645 (configuration['mode'] == 'debug') ? 'Debug_' : 'Release_'; |
| 647 var temp = ['${debugMode}_${configuration["arch"]}']; | 646 var temp = ['${debugMode}_${configuration["arch"]}']; |
| 648 temp.addAll(generatedTestPath); | 647 temp.addAll(generatedTestPath); |
| 649 generatedTestPath = temp; | 648 generatedTestPath = temp; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 668 if (!tempDir.existsSync()) { | 667 if (!tempDir.existsSync()) { |
| 669 tempDir.createSync(); | 668 tempDir.createSync(); |
| 670 } | 669 } |
| 671 } | 670 } |
| 672 tempDirPath = new File(tempDirPath).fullPathSync().replaceAll('\\', '/'); | 671 tempDirPath = new File(tempDirPath).fullPathSync().replaceAll('\\', '/'); |
| 673 return TestUtils.mkdirRecursive(tempDirPath, | 672 return TestUtils.mkdirRecursive(tempDirPath, |
| 674 Strings.join(generatedTestPath, '/')); | 673 Strings.join(generatedTestPath, '/')); |
| 675 } | 674 } |
| 676 | 675 |
| 677 String get scriptType() { | 676 String get scriptType() { |
| 678 switch (configuration['component']) { | 677 switch (configuration['compiler']) { |
| 679 case 'dartium': | 678 case 'none': |
| 680 return 'application/dart'; | 679 return 'application/dart'; |
| 681 case 'frogium': | 680 case 'frog': |
| 682 case 'legium': | 681 case 'frogsh': |
| 683 case 'webdriver': | 682 case 'dart2js': |
| 683 case 'dartc': |
| 684 return 'text/javascript'; | 684 return 'text/javascript'; |
| 685 default: | 685 default: |
| 686 Expect.fail('Unimplemented component scriptType'); | 686 Expect.fail('Non-web runtime, so no scriptType for: ' + |
| 687 '${configuration["compiler"]}'); |
| 687 return null; | 688 return null; |
| 688 } | 689 } |
| 689 } | 690 } |
| 690 | 691 |
| 691 String getHtmlName(String filename) { | 692 String getHtmlName(String filename) { |
| 692 return filename.replaceAll('/', '_').replaceAll(':', '_') | 693 return filename.replaceAll('/', '_').replaceAll(':', '_') |
| 693 .replaceAll('\\', '_') + configuration['component'] + '.html'; | 694 .replaceAll('\\', '_') + configuration['compiler'] + '-' + |
| 695 configuration['runtime'] + '.html'; |
| 694 } | 696 } |
| 695 | 697 |
| 696 String get dumpRenderTreeFilename() { | 698 String get dumpRenderTreeFilename() { |
| 697 if (configuration['drt'] != '') { | 699 if (configuration['drt'] != '') { |
| 698 return configuration['drt']; | 700 return configuration['drt']; |
| 699 } | 701 } |
| 700 if (new Platform().operatingSystem() == 'macos') { | 702 if (new Platform().operatingSystem() == 'macos') { |
| 701 return '$dartDir/client/tests/drt/DumpRenderTree.app/Contents/' + | 703 return '$dartDir/client/tests/drt/DumpRenderTree.app/Contents/' + |
| 702 'MacOS/DumpRenderTree'; | 704 'MacOS/DumpRenderTree'; |
| 703 } | 705 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 722 } | 724 } |
| 723 } | 725 } |
| 724 | 726 |
| 725 void completeHandler(TestCase testCase) { | 727 void completeHandler(TestCase testCase) { |
| 726 } | 728 } |
| 727 | 729 |
| 728 List<List<String>> argumentListsFromFile(String filename, | 730 List<List<String>> argumentListsFromFile(String filename, |
| 729 Map optionsFromFile) { | 731 Map optionsFromFile) { |
| 730 List args = TestUtils.standardOptions(configuration); | 732 List args = TestUtils.standardOptions(configuration); |
| 731 args.addAll(additionalOptions(filename)); | 733 args.addAll(additionalOptions(filename)); |
| 732 if (configuration['component'] == 'dartc') { | 734 if (configuration['compiler'] == 'dartc') { |
| 733 args.add('--error_format'); | 735 args.add('--error_format'); |
| 734 args.add('machine'); | 736 args.add('machine'); |
| 735 } | 737 } |
| 736 | 738 |
| 737 bool isMultitest = optionsFromFile["isMultitest"]; | 739 bool isMultitest = optionsFromFile["isMultitest"]; |
| 738 List<String> dartOptions = optionsFromFile["dartOptions"]; | 740 List<String> dartOptions = optionsFromFile["dartOptions"]; |
| 739 List<List<String>> vmOptionsList = optionsFromFile["vmOptions"]; | 741 List<List<String>> vmOptionsList = optionsFromFile["vmOptions"]; |
| 740 Expect.isTrue(!isMultitest || dartOptions == null); | 742 Expect.isTrue(!isMultitest || dartOptions == null); |
| 741 if (dartOptions == null) { | 743 if (dartOptions == null) { |
| 742 args.add(filename); | 744 args.add(filename); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 943 !filename.contains('com/google/dart/compiler/vm') && | 945 !filename.contains('com/google/dart/compiler/vm') && |
| 944 !filename.contains('com/google/dart/corelib/SharedTests.java'); | 946 !filename.contains('com/google/dart/corelib/SharedTests.java'); |
| 945 | 947 |
| 946 void forEachTest(Function onTest, | 948 void forEachTest(Function onTest, |
| 947 Map testCacheIgnored, | 949 Map testCacheIgnored, |
| 948 String globalTempDir(), | 950 String globalTempDir(), |
| 949 [Function onDone = null]) { | 951 [Function onDone = null]) { |
| 950 doTest = onTest; | 952 doTest = onTest; |
| 951 doDone = (onDone != null) ? onDone : (() => null); | 953 doDone = (onDone != null) ? onDone : (() => null); |
| 952 | 954 |
| 953 if (configuration['component'] != 'dartc') { | 955 if (configuration['compiler'] != 'dartc') { |
| 954 // Do nothing. Asynchronously report that the suite is enqueued. | 956 // Do nothing. Asynchronously report that the suite is enqueued. |
| 955 new Timer(0, (timerUnused){ doDone(); }); | 957 new Timer(0, (timerUnused){ doDone(); }); |
| 956 return; | 958 return; |
| 957 } | 959 } |
| 958 RegExp pattern = configuration['selectors']['dartc']; | 960 RegExp pattern = configuration['selectors']['dartc']; |
| 959 if (!pattern.hasMatch('junit_tests')) { | 961 if (!pattern.hasMatch('junit_tests')) { |
| 960 new Timer(0, (timerUnused){ doDone(); }); | 962 new Timer(0, (timerUnused){ doDone(); }); |
| 961 return; | 963 return; |
| 962 } | 964 } |
| 963 | 965 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 989 String testRelativePath = | 991 String testRelativePath = |
| 990 filename.substring(index + 'compiler/javatests/'.length, | 992 filename.substring(index + 'compiler/javatests/'.length, |
| 991 filename.length - '.java'.length); | 993 filename.length - '.java'.length); |
| 992 String testClass = testRelativePath.replaceAll('/', '.'); | 994 String testClass = testRelativePath.replaceAll('/', '.'); |
| 993 testClasses.add(testClass); | 995 testClasses.add(testClass); |
| 994 } | 996 } |
| 995 } | 997 } |
| 996 | 998 |
| 997 void createTest(successIgnored) { | 999 void createTest(successIgnored) { |
| 998 String d8 = | 1000 String d8 = |
| 999 "$buildDir/d8${TestUtils.executableSuffix(configuration['component'])}"; | 1001 "$buildDir/d8${TestUtils.executableSuffix(configuration['runtime'])}"; |
| 1000 List<String> args = <String>[ | 1002 List<String> args = <String>[ |
| 1001 '-ea', | 1003 '-ea', |
| 1002 '-classpath', classPath, | 1004 '-classpath', classPath, |
| 1003 '-Dcom.google.dart.runner.d8=$d8', | 1005 '-Dcom.google.dart.runner.d8=$d8', |
| 1004 '-Dcom.google.dart.corelib.SharedTests.test_py=' + | 1006 '-Dcom.google.dart.corelib.SharedTests.test_py=' + |
| 1005 dartDir + '/tools/test.py', | 1007 dartDir + '/tools/test.py', |
| 1006 'org.junit.runner.JUnitCore']; | 1008 'org.junit.runner.JUnitCore']; |
| 1007 args.addAll(testClasses); | 1009 args.addAll(testClasses); |
| 1008 | 1010 |
| 1009 doTest(new TestCase(suiteName, | 1011 doTest(new TestCase(suiteName, |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1063 * Copy a [source] file to a new place. | 1065 * Copy a [source] file to a new place. |
| 1064 * Assumes that the directory for [dest] already exists. | 1066 * Assumes that the directory for [dest] already exists. |
| 1065 */ | 1067 */ |
| 1066 static void copyFile(File source, File dest) { | 1068 static void copyFile(File source, File dest) { |
| 1067 List contents = source.readAsBytesSync(); | 1069 List contents = source.readAsBytesSync(); |
| 1068 RandomAccessFile handle = dest.openSync(FileMode.WRITE); | 1070 RandomAccessFile handle = dest.openSync(FileMode.WRITE); |
| 1069 handle.writeListSync(contents, 0, contents.length); | 1071 handle.writeListSync(contents, 0, contents.length); |
| 1070 handle.closeSync(); | 1072 handle.closeSync(); |
| 1071 } | 1073 } |
| 1072 | 1074 |
| 1073 static String executableSuffix(String component) { | 1075 static String executableSuffix(String executable) { |
| 1074 if (new Platform().operatingSystem() == 'windows') { | 1076 if (new Platform().operatingSystem() == 'windows') { |
| 1075 if (component != 'frogium' | 1077 if (executable == 'd8' || executable == 'vm') { |
| 1076 && component != 'legium' | |
| 1077 && component != 'webdriver') { | |
| 1078 return '.exe'; | 1078 return '.exe'; |
| 1079 } else { | 1079 } else { |
| 1080 return '.bat'; | 1080 return '.bat'; |
| 1081 } | 1081 } |
| 1082 } | 1082 } |
| 1083 return ''; | 1083 return ''; |
| 1084 } | 1084 } |
| 1085 | 1085 |
| 1086 static String executableName(Map configuration) { | 1086 static String executableName(Map configuration) { |
| 1087 String suffix = executableSuffix(configuration['component']); | 1087 String suffix = executableSuffix(configuration['compiler']); |
| 1088 switch (configuration['component']) { | 1088 switch (configuration['compiler']) { |
| 1089 case 'vm': | 1089 case 'none': |
| 1090 return 'dart$suffix'; | 1090 return 'dart$suffix'; |
| 1091 case 'dartc': | 1091 case 'dartc': |
| 1092 return 'compiler/bin/dartc$suffix'; | 1092 return 'compiler/bin/dartc$suffix'; |
| 1093 case 'frog': | 1093 case 'frog': |
| 1094 case 'dart2js': | 1094 case 'dart2js': |
| 1095 return 'frog/bin/frog$suffix'; | 1095 return 'frog/bin/frog$suffix'; |
| 1096 case 'frogsh': | 1096 case 'frogsh': |
| 1097 return 'frog/bin/frogsh$suffix'; | 1097 return 'frog/bin/frogsh$suffix'; |
| 1098 default: | 1098 default: |
| 1099 throw "Unknown executable for: ${configuration['component']}"; | 1099 throw "Unknown executable for: ${configuration['compiler']}"; |
| 1100 } | 1100 } |
| 1101 } | 1101 } |
| 1102 | 1102 |
| 1103 static String compilerName(Map configuration) { | 1103 static String compilerName(Map configuration) { |
| 1104 String suffix = executableSuffix(configuration['component']); | 1104 String suffix = executableSuffix(configuration['compiler']); |
| 1105 switch (configuration['component']) { | 1105 switch (configuration['compiler']) { |
| 1106 case 'dartc': | 1106 case 'dartc': |
| 1107 return 'compiler/bin/dartc$suffix'; | 1107 return 'compiler/bin/dartc$suffix'; |
| 1108 case 'frogium': | 1108 case 'frog': |
| 1109 case 'legium': | 1109 case 'dart2js': |
| 1110 case 'webdriver': | |
| 1111 return 'frog/bin/frog$suffix'; | 1110 return 'frog/bin/frog$suffix'; |
| 1112 default: | 1111 default: |
| 1113 throw "Unknown compiler for: ${configuration['component']}"; | 1112 throw "Unknown compiler for: ${configuration['compiler']}"; |
| 1114 } | 1113 } |
| 1115 } | 1114 } |
| 1116 | 1115 |
| 1117 static String dartShellFileName(Map configuration) { | 1116 static String dartShellFileName(Map configuration) { |
| 1118 var name = '${buildDir(configuration)}/${executableName(configuration)}'; | 1117 var name = '${buildDir(configuration)}/${executableName(configuration)}'; |
| 1119 if (!(new File(name)).existsSync() && !configuration['list']) { | 1118 if (!(new File(name)).existsSync() && !configuration['list']) { |
| 1120 throw "Executable '$name' does not exist"; | 1119 throw "Executable '$name' does not exist"; |
| 1121 } | 1120 } |
| 1122 return name; | 1121 return name; |
| 1123 } | 1122 } |
| 1124 | 1123 |
| 1125 static String compilerPath(Map configuration) { | 1124 static String compilerPath(Map configuration) { |
| 1126 if (configuration['component'] == 'dartium') { | 1125 if (configuration['compiler'] == 'none') { |
| 1127 return null; // No separate compiler for dartium tests. | 1126 return null; // No separate compiler for dartium tests. |
| 1128 } | 1127 } |
| 1129 var name = configuration['frog']; | 1128 var name = '${buildDir(configuration)}/${compilerName(configuration)}'; |
| 1130 if (name == '') { | |
| 1131 name = '${buildDir(configuration)}/${compilerName(configuration)}'; | |
| 1132 } | |
| 1133 if (!(new File(name)).existsSync() && !configuration['list']) { | 1129 if (!(new File(name)).existsSync() && !configuration['list']) { |
| 1134 throw "Executable '$name' does not exist"; | 1130 throw "Executable '$name' does not exist"; |
| 1135 } | 1131 } |
| 1136 return name; | 1132 return name; |
| 1137 } | 1133 } |
| 1138 | 1134 |
| 1139 static String outputDir(Map configuration) { | 1135 static String outputDir(Map configuration) { |
| 1140 var result = ''; | 1136 var result = ''; |
| 1141 var system = configuration['system']; | 1137 var system = configuration['system']; |
| 1142 if (system == 'linux') { | 1138 if (system == 'linux') { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1159 String toolsDir = scriptPath.substring(0, scriptPath.lastIndexOf('/')); | 1155 String toolsDir = scriptPath.substring(0, scriptPath.lastIndexOf('/')); |
| 1160 return new File('$toolsDir/..').fullPathSync().replaceAll('\\', '/'); | 1156 return new File('$toolsDir/..').fullPathSync().replaceAll('\\', '/'); |
| 1161 } | 1157 } |
| 1162 | 1158 |
| 1163 static List<String> standardOptions(Map configuration) { | 1159 static List<String> standardOptions(Map configuration) { |
| 1164 List args = ["--ignore-unrecognized-flags"]; | 1160 List args = ["--ignore-unrecognized-flags"]; |
| 1165 if (configuration["checked"]) { | 1161 if (configuration["checked"]) { |
| 1166 args.add('--enable_asserts'); | 1162 args.add('--enable_asserts'); |
| 1167 args.add("--enable_type_checks"); | 1163 args.add("--enable_type_checks"); |
| 1168 } | 1164 } |
| 1169 if (configuration["component"] == "dart2js" | 1165 if (configuration["compiler"] == "dart2js") { |
| 1170 || configuration["component"] == "legium") { | |
| 1171 args.add("--verbose"); | 1166 args.add("--verbose"); |
| 1172 args.add("--leg"); | 1167 args.add("--leg"); |
| 1173 if (configuration["host_checked"]) { | 1168 if (configuration["host_checked"]) { |
| 1174 args.add("--vm_flags=--enable_asserts --enable_type_checks"); | 1169 args.add("--vm_flags=--enable_asserts --enable_type_checks"); |
| 1175 } | 1170 } |
| 1176 if (configuration["component"] == "dart2js") { | 1171 if (configuration['runtime'] != 'drt') { |
| 1177 args.add("--allow-mock-compilation"); | 1172 args.add("--allow-mock-compilation"); |
| 1178 } | 1173 } |
| 1179 } | 1174 } |
| 1180 return args; | 1175 return args; |
| 1181 } | 1176 } |
| 1182 | 1177 |
| 1183 static bool isBrowserComponent(String component) => | 1178 static bool isBrowserRuntime(String runtime) => |
| 1184 const <String>['dartium', | 1179 const <String>['drt', |
| 1185 'frogium', | 1180 'ie', |
| 1186 'legium', | 1181 'safari', |
| 1187 'webdriver'].some((x) => x == component); | 1182 'opera', |
| 1183 'chrome', |
| 1184 'ff'].some((x) => x == runtime); |
| 1188 } | 1185 } |
| 1189 | 1186 |
| 1190 class SummaryReport { | 1187 class SummaryReport { |
| 1191 static int total = 0; | 1188 static int total = 0; |
| 1192 static int skipped = 0; | 1189 static int skipped = 0; |
| 1193 static int noCrash = 0; | 1190 static int noCrash = 0; |
| 1194 static int pass = 0; | 1191 static int pass = 0; |
| 1195 static int failOk = 0; | 1192 static int failOk = 0; |
| 1196 static int fail = 0; | 1193 static int fail = 0; |
| 1197 static int crash = 0; | 1194 static int crash = 0; |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1231 * $noCrash tests are expected to be flaky but not crash | 1228 * $noCrash tests are expected to be flaky but not crash |
| 1232 * $pass tests are expected to pass | 1229 * $pass tests are expected to pass |
| 1233 * $failOk tests are expected to fail that we won't fix | 1230 * $failOk tests are expected to fail that we won't fix |
| 1234 * $fail tests are expected to fail that we should fix | 1231 * $fail tests are expected to fail that we should fix |
| 1235 * $crash tests are expected to crash that we should fix | 1232 * $crash tests are expected to crash that we should fix |
| 1236 * $timeout tests are allowed to timeout | 1233 * $timeout tests are allowed to timeout |
| 1237 """; | 1234 """; |
| 1238 print(report); | 1235 print(report); |
| 1239 } | 1236 } |
| 1240 } | 1237 } |
| OLD | NEW |