OLD | NEW |
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 (function() { | 5 (function() { |
6 'use strict'; | 6 'use strict'; |
7 | 7 |
8 let dart_sdk = dart_library.import('dart_sdk'); | 8 let dart_sdk = dart_library.import('dart_sdk'); |
9 dart_sdk._isolate_helper.startRootIsolate(function() {}, []); | 9 dart_sdk._isolate_helper.startRootIsolate(function() {}, []); |
10 let async_helper = dart_library.import('async_helper').async_helper; | 10 let async_helper = dart_library.import('async_helper').async_helper; |
11 | 11 let unittest = dart_library.import('unittest'); |
| 12 let html_config = unittest.html_config; |
12 // Test attributes are a list of strings, or a string for a single | 13 // Test attributes are a list of strings, or a string for a single |
13 // attribute. Valid attribues are: | 14 // attribute. Valid attribues are: |
14 // | 15 // |
15 // 'skip' - don't run the test | 16 // 'skip' - don't run the test |
16 // 'fail' - test fails | 17 // 'fail' - test fails |
17 // 'timeout' - test times out | 18 // 'timeout' - test times out |
18 // 'slow' - use 5s timeout instead of default 2s. | 19 // 'slow' - use 5s timeout instead of default 2s. |
19 // 'helper' - not a test, used by other tests. | 20 // 'helper' - not a test, used by other tests. |
20 // 'unittest' - run separately as a unittest test. | 21 // 'unittest' - run separately as a unittest test. |
21 // | 22 // |
22 // Common combinations: | 23 // Common combinations: |
23 const fail = 'fail'; | 24 const fail = 'fail'; |
24 const skip_fail = ['skip', 'fail']; | 25 const skip_fail = ['skip', 'fail']; |
25 const skip_timeout = ['skip', 'timeout']; | 26 const skip_timeout = ['skip', 'timeout']; |
26 | 27 |
| 28 // The number of expected unittest errors should be zero but unfortunately |
| 29 // there are a lot of broken html unittests. |
| 30 let num_expected_unittest_errors = 5; |
| 31 |
27 // TODO(jmesserly): separate StrongModeError from other errors. | 32 // TODO(jmesserly): separate StrongModeError from other errors. |
28 let all_status = { | 33 let all_status = { |
29 'language': { | 34 'language': { |
30 'arithmetic2_test': fail, | 35 'arithmetic2_test': fail, |
31 'assert_with_type_test_or_cast_test': skip_fail, | 36 'assert_with_type_test_or_cast_test': skip_fail, |
32 'assertion_test': skip_fail, | 37 'assertion_test': skip_fail, |
33 'async_await_test_none_multi': 'unittest', | 38 'async_await_test_none_multi': 'unittest', |
34 'async_star_await_pauses_test': skip_fail, | 39 'async_star_await_pauses_test': skip_fail, |
35 | 40 |
36 // TODO(jmesserly): figure out why this test is hanging. | 41 // TODO(jmesserly): figure out why this test is hanging. |
37 'async_star_cancel_and_throw_in_finally_test': skip_timeout, | 42 'async_star_cancel_and_throw_in_finally_test': skip_timeout, |
38 | 43 |
39 'async_star_cancel_while_paused_test': skip_fail, | 44 'async_star_cancel_while_paused_test': skip_fail, |
| 45 'async_star_regression_fisk_test': skip_fail, |
40 | 46 |
41 // TODO(vsm): Re-enable. | 47 // TODO(vsm): Re-enable. |
42 // See https://github.com/dart-lang/dev_compiler/issues/456 | 48 // See https://github.com/dart-lang/dev_compiler/issues/456 |
43 'async_star_test_none_multi': ['unittest', 'skip', 'fail'], | 49 'async_star_test_none_multi': ['unittest', 'skip', 'fail'], |
44 'async_star_test_01_multi': ['unittest', 'skip', 'fail'], | 50 'async_star_test_01_multi': ['unittest', 'skip', 'fail'], |
45 'async_star_test_02_multi': ['unittest', 'skip', 'fail'], | 51 'async_star_test_02_multi': ['unittest', 'skip', 'fail'], |
46 'async_star_test_03_multi': ['unittest', 'skip', 'fail'], | 52 'async_star_test_03_multi': ['unittest', 'skip', 'fail'], |
47 'async_star_test_04_multi': ['unittest', 'skip', 'fail'], | 53 'async_star_test_04_multi': ['unittest', 'skip', 'fail'], |
48 'async_star_test_05_multi': ['unittest', 'skip', 'fail'], | 54 'async_star_test_05_multi': ['unittest', 'skip', 'fail'], |
49 | 55 |
| 56 'async_switch_test': skip_fail, |
50 'asyncstar_throw_in_catch_test': skip_fail, | 57 'asyncstar_throw_in_catch_test': skip_fail, |
51 'await_future_test': skip_fail, | 58 'await_future_test': skip_fail, |
52 'bit_operations_test_none_multi': skip_fail, | 59 'bit_operations_test_none_multi': skip_fail, |
53 'bit_shift_test': skip_fail, | 60 'bit_shift_test': skip_fail, |
54 'bool_test': skip_fail, | 61 'bool_test': skip_fail, |
55 'bound_closure_equality_test': skip_fail, | 62 'bound_closure_equality_test': skip_fail, |
56 'branch_canonicalization_test': skip_fail, // JS bit operations truncate
to 32 bits. | 63 'branch_canonicalization_test': skip_fail, // JS bit operations truncate
to 32 bits. |
57 'call_closurization_test': skip_fail, | 64 'call_closurization_test': skip_fail, |
58 'call_function_apply_test': skip_fail, | 65 'call_function_apply_test': skip_fail, |
59 'call_operator_test': skip_fail, | 66 'call_operator_test': skip_fail, |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 | 472 |
466 // TODO(vsm): List.toString is different in DDC | 473 // TODO(vsm): List.toString is different in DDC |
467 // https://github.com/dart-lang/dev_compiler/issues/445 | 474 // https://github.com/dart-lang/dev_compiler/issues/445 |
468 'setRange_1_test': skip_fail, | 475 'setRange_1_test': skip_fail, |
469 'setRange_2_test': skip_fail, | 476 'setRange_2_test': skip_fail, |
470 'setRange_3_test': skip_fail, | 477 'setRange_3_test': skip_fail, |
471 'setRange_4_test': skip_fail, | 478 'setRange_4_test': skip_fail, |
472 'setRange_5_test': skip_fail, | 479 'setRange_5_test': skip_fail, |
473 }, | 480 }, |
474 | 481 |
| 482 // TODO(jacobr): enable more of the html tests in unittest once they have |
| 483 // more hope of passing. Triage tests that can never run in this test |
| 484 // runner and track them separately. |
475 'lib/html': { | 485 'lib/html': { |
| 486 'async_spawnuri_test': ['unittest', 'skip', 'fail'], |
| 487 'async_test': ['unittest', 'skip', 'fail'], |
| 488 'audiobuffersourcenode_test': ['unittest', 'skip', 'fail'], |
| 489 'audiocontext_test': ['unittest', 'skip', 'fail'], |
| 490 'audioelement_test': ['unittest', 'skip', 'fail'], |
| 491 'b_element_test': ['unittest', 'skip', 'fail'], |
| 492 'blob_constructor_test': ['unittest', 'skip', 'fail'], |
| 493 'cache_test': ['unittest', 'skip', 'fail'], |
| 494 'callbacks_test': ['unittest', 'skip', 'fail'], |
| 495 'canvas_pixel_array_type_alias_test': ['unittest'], |
| 496 'canvasrenderingcontext2d_test': ['unittest'], |
| 497 'canvas_test': ['unittest'], |
| 498 'cdata_test': ['unittest', 'skip', 'fail'], |
| 499 'client_rect_test': ['unittest', 'skip', 'fail'], |
| 500 'cross_domain_iframe_test': ['unittest', 'skip', 'fail'], |
| 501 'cross_frame_test': ['unittest', 'skip', 'fail'], |
| 502 'crypto_test': ['unittest', 'skip', 'fail'], |
| 503 'css_rule_list_test': ['unittest', 'skip', 'fail'], |
| 504 'cssstyledeclaration_test': ['unittest', 'skip', 'fail'], |
| 505 'css_test': ['unittest', 'skip', 'fail'], |
| 506 'custom_element_method_clash_test': ['unittest', 'skip', 'fail'], |
| 507 'custom_element_name_clash_test': ['unittest', 'skip', 'fail'], |
| 508 'custom_elements_23127_test': ['unittest', 'skip', 'fail'], |
| 509 'custom_elements_test': ['unittest', 'skip', 'fail'], |
| 510 'custom_tags_test': ['unittest', 'skip', 'fail'], |
| 511 'dart_object_local_storage_test': ['unittest', 'skip', 'fail'], |
| 512 'datalistelement_test': ['unittest', 'skip', 'fail'], |
| 513 'documentfragment_test': ['unittest', 'skip', 'fail'], |
| 514 'document_test': ['unittest'], |
| 515 'dom_constructors_test': ['unittest', 'skip', 'fail'], |
| 516 'domparser_test': ['unittest', 'skip', 'fail'], |
| 517 'element_add_test': ['unittest', 'skip', 'fail'], |
| 518 'element_animate_test': ['unittest', 'skip', 'fail'], |
| 519 'element_classes_svg_test': ['unittest', 'skip', 'fail'], |
| 520 'element_classes_test': ['unittest', 'skip', 'fail'], |
| 521 'element_constructor_1_test': ['unittest', 'skip', 'fail'], |
| 522 'element_dimensions_test': ['unittest', 'skip', 'fail'], |
| 523 'element_offset_test': ['unittest', 'skip', 'fail'], |
| 524 'element_test': ['unittest', 'skip', 'fail'], |
| 525 'element_types_constructors1_test': ['unittest', 'skip', 'fail'], |
| 526 'element_types_constructors2_test': ['unittest', 'skip', 'fail'], |
| 527 'element_types_constructors3_test': ['unittest', 'skip', 'fail'], |
| 528 'element_types_constructors4_test': ['unittest', 'skip', 'fail'], |
| 529 'element_types_constructors5_test': ['unittest', 'skip', 'fail'], |
| 530 'element_types_constructors6_test': ['unittest', 'skip', 'fail'], |
| 531 'element_types_test': ['unittest', 'skip', 'fail'], |
| 532 'event_customevent_test': ['unittest', 'skip', 'fail'], |
| 533 'events_test': ['unittest', 'skip', 'fail'], |
| 534 'event_test': ['unittest', 'skip', 'fail'], |
| 535 'exceptions_test': ['unittest', 'skip', 'fail'], |
| 536 'fileapi_test': ['unittest', 'skip', 'fail'], |
| 537 'filereader_test': ['unittest', 'skip', 'fail'], |
| 538 'filteredelementlist_test': ['unittest', 'skip', 'fail'], |
| 539 'fontface_loaded_test': ['unittest', 'skip', 'fail'], |
| 540 'fontface_test': ['unittest', 'skip', 'fail'], |
| 541 'form_data_test': ['unittest', 'skip', 'fail'], |
| 542 'form_element_test': ['unittest', 'skip', 'fail'], |
| 543 'geolocation_test': ['unittest', 'skip', 'fail'], |
| 544 'hidden_dom_1_test': ['unittest', 'skip', 'fail'], |
| 545 'hidden_dom_2_test': ['unittest', 'skip', 'fail'], |
| 546 'history_test': ['unittest', 'skip', 'fail'], |
| 547 'htmlcollection_test': ['unittest', 'skip', 'fail'], |
| 548 'htmlelement_test': ['unittest', 'skip', 'fail'], |
| 549 'htmloptionscollection_test': ['unittest', 'skip', 'fail'], |
| 550 'indexeddb_1_test': ['unittest', 'skip', 'fail'], |
| 551 'indexeddb_2_test': ['unittest', 'skip', 'fail'], |
| 552 'indexeddb_3_test': ['unittest', 'skip', 'fail'], |
| 553 'indexeddb_4_test': ['unittest', 'skip', 'fail'], |
| 554 'indexeddb_5_test': ['unittest', 'skip', 'fail'], |
| 555 'input_element_test': ['unittest', 'skip', 'fail'], |
| 556 'instance_of_test': ['unittest', 'skip', 'fail'], |
| 557 'interactive_test': ['unittest', 'skip', 'fail'], |
| 558 'isolates_test': ['unittest', 'skip', 'fail'], |
| 559 'js_function_getter_test': ['unittest', 'skip', 'fail'], |
| 560 'js_function_getter_trust_types_test': ['unittest', 'skip', 'fail'], |
| 561 'js_interop_1_test': ['unittest', 'skip', 'fail'], |
| 562 'js_test': ['unittest', 'skip', 'fail'], |
| 563 'js_typed_interop_anonymous2_exp_test': ['unittest', 'skip', 'fail'], |
| 564 'js_typed_interop_anonymous2_test': ['unittest', 'skip', 'fail'], |
| 565 'js_typed_interop_anonymous_exp_test': ['unittest', 'skip', 'fail'], |
| 566 'js_typed_interop_anonymous_test': ['unittest', 'skip', 'fail'], |
| 567 'js_typed_interop_anonymous_unreachable_exp_test': ['unittest', 'skip', 'f
ail'], |
| 568 'js_typed_interop_anonymous_unreachable_test': ['unittest', 'skip', 'fail'
], |
| 569 'js_typed_interop_default_arg_test': ['unittest', 'skip', 'fail'], |
| 570 'js_typed_interop_side_cast_exp_test': ['unittest', 'skip', 'fail'], |
| 571 'js_typed_interop_side_cast_test': ['unittest', 'skip', 'fail'], |
| 572 'js_typed_interop_test': ['unittest', 'skip', 'fail'], |
| 573 'keyboard_event_test': ['unittest', 'skip', 'fail'], |
| 574 'localstorage_test': ['unittest', 'skip', 'fail'], |
| 575 'location_test': ['unittest', 'skip', 'fail'], |
| 576 'mediasource_test': ['unittest', 'skip', 'fail'], |
| 577 'media_stream_test': ['unittest', 'skip', 'fail'], |
| 578 'messageevent_test': ['unittest', 'skip', 'fail'], |
| 579 'mirrors_js_typed_interop_test': ['unittest', 'skip', 'fail'], |
| 580 'mouse_event_test': ['unittest', 'skip', 'fail'], |
| 581 'mutationobserver_test': ['unittest', 'skip', 'fail'], |
| 582 'native_gc_test': ['unittest', 'skip', 'fail'], |
| 583 'navigator_test': ['unittest', 'skip', 'fail'], |
| 584 'node_test': ['unittest', 'skip', 'fail'], |
| 585 'node_validator_important_if_you_suppress_make_the_bug_critical_test': ['u
nittest', 'skip', 'fail'], |
| 586 'non_instantiated_is_test': ['unittest', 'skip', 'fail'], |
| 587 'notification_test': ['unittest', 'skip', 'fail'], |
| 588 'performance_api_test': ['unittest', 'skip', 'fail'], |
| 589 'postmessage_structured_test': ['unittest', 'skip', 'fail'], |
| 590 'private_extension_member_test': ['unittest', 'skip', 'fail'], |
| 591 'queryall_test': ['unittest', 'skip', 'fail'], |
| 592 'query_test': ['unittest', 'skip', 'fail'], |
| 593 'range_test': ['unittest', 'skip', 'fail'], |
| 594 'request_animation_frame_test': ['unittest', 'skip', 'fail'], |
| 595 'resource_http_test': ['unittest', 'skip', 'fail'], |
| 596 'rtc_test': ['unittest', 'skip', 'fail'], |
| 597 'selectelement_test': ['unittest', 'skip', 'fail'], |
| 598 'serialized_script_value_test': ['unittest', 'skip', 'fail'], |
| 599 'shadow_dom_test': ['unittest', 'skip', 'fail'], |
| 600 'shadowroot_test': ['unittest', 'skip', 'fail'], |
| 601 'speechrecognition_test': ['unittest', 'skip', 'fail'], |
| 602 'storage_test': ['unittest', 'skip', 'fail'], |
| 603 'streams_test': ['unittest', 'skip', 'fail'], |
| 604 'svgelement_test': ['unittest', 'skip', 'fail'], |
| 605 'svg_test': ['unittest', 'skip', 'fail'], |
| 606 'table_test': ['unittest', 'skip', 'fail'], |
| 607 'text_event_test': ['unittest', 'skip', 'fail'], |
| 608 'touchevent_test': ['unittest', 'skip', 'fail'], |
| 609 'track_element_constructor_test': ['unittest', 'skip', 'fail'], |
| 610 'transferables_test': ['unittest', 'skip', 'fail'], |
| 611 'transition_event_test': ['unittest', 'skip', 'fail'], |
| 612 'trusted_html_tree_sanitizer_test': ['unittest', 'skip', 'fail'], |
| 613 'typed_arrays_1_test': ['unittest', 'skip', 'fail'], |
| 614 'typed_arrays_2_test': ['unittest', 'skip', 'fail'], |
| 615 'typed_arrays_3_test': ['unittest', 'skip', 'fail'], |
| 616 'typed_arrays_4_test': ['unittest', 'skip', 'fail'], |
| 617 'typed_arrays_5_test': ['unittest', 'skip', 'fail'], |
| 618 'typed_arrays_arraybuffer_test': ['unittest', 'skip', 'fail'], |
| 619 'typed_arrays_dataview_test': ['unittest', 'skip', 'fail'], |
| 620 'typed_arrays_range_checks_test': ['unittest', 'skip', 'fail'], |
| 621 'typed_arrays_simd_test': ['unittest', 'skip', 'fail'], |
| 622 'typing_test': ['unittest', 'skip', 'fail'], |
| 623 'unknownelement_test': ['unittest', 'skip', 'fail'], |
| 624 'uri_test': ['unittest', 'skip', 'fail'], |
| 625 'url_test': ['unittest', 'skip', 'fail'], |
| 626 'webgl_1_test': ['unittest', 'skip', 'fail'], |
| 627 'websocket_test': ['unittest', 'skip', 'fail'], |
| 628 'websql_test': ['unittest', 'skip', 'fail'], |
| 629 'wheelevent_test': ['unittest', 'skip', 'fail'], |
| 630 'window_eq_test': ['unittest', 'skip', 'fail'], |
| 631 'window_mangling_test': ['unittest', 'skip', 'fail'], |
| 632 'window_nosuchmethod_test': ['unittest', 'skip', 'fail'], |
| 633 'window_test': ['unittest', 'skip', 'fail'], |
| 634 'worker_api_test': ['unittest', 'skip', 'fail'], |
| 635 'worker_test': ['unittest', 'skip', 'fail'], |
| 636 'wrapping_collections_test': ['unittest', 'skip', 'fail'], |
| 637 'xhr_cross_origin_test': ['unittest', 'skip', 'fail'], |
| 638 'xhr_test': ['unittest', 'skip', 'fail'], |
| 639 'xsltprocessor_test': ['unittest', 'skip', 'fail'], |
| 640 |
| 641 'js_typed_interop_default_arg_test_none_multi': ['unittest', 'skip', 'fail
'], |
| 642 'js_typed_interop_default_arg_test_explicit_argument_multi': ['unittest',
'skip', 'fail'], |
| 643 'js_typed_interop_default_arg_test_default_value_multi': ['unittest', 'ski
p', 'fail'] |
476 }, | 644 }, |
477 }; | 645 }; |
478 | 646 |
479 let unittest_tests = []; | 647 let unittest_tests = []; |
480 | 648 |
481 let languageTestPattern = new RegExp('(.*)/([^/]*_test[^/]*)'); | 649 let languageTestPattern = new RegExp('(.*)/([^/]*_test[^/]*)'); |
| 650 html_config.useHtmlConfiguration(); |
| 651 // We need to let Dart unittest control when tests are run not mocha. |
| 652 // mocha.allowUncaught(true); |
| 653 let dartUnittestsLeft = 0; |
482 for (let testFile of dart_library.libraries()) { | 654 for (let testFile of dart_library.libraries()) { |
483 let match = languageTestPattern.exec(testFile); | 655 let match = languageTestPattern.exec(testFile); |
484 if (match != null) { | 656 if (match != null) { |
485 let status_group = match[1] | 657 let status_group = match[1] |
486 let name = match[2]; | 658 let name = match[2]; |
487 let module = match[0]; | 659 let module = match[0]; |
488 | 660 |
489 let status = all_status[status_group]; | 661 let status = all_status[status_group]; |
490 if (status == null) throw "No status for '" + status_group + "'"; | 662 if (status == null) throw "No status for '" + status_group + "'"; |
491 | 663 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
554 } else { | 726 } else { |
555 mainLibrary.main(); | 727 mainLibrary.main(); |
556 } | 728 } |
557 } | 729 } |
558 | 730 |
559 if (!async_helper.asyncTestStarted) done(); | 731 if (!async_helper.asyncTestStarted) done(); |
560 }); | 732 }); |
561 } | 733 } |
562 } | 734 } |
563 | 735 |
564 for (let action of unittest_tests) { | 736 let mochaOnError; |
565 action(); | 737 // We run these tests in a mocha test wrapper to avoid the confusing failure |
566 } | 738 // case of dart unittests being interleaved with mocha tests. |
| 739 // In practice we are really just suppressing all mocha test behavior while |
| 740 // Dart unittests run and then re-enabling it when the dart tests complete. |
| 741 test('run all dart unittests', function(done) { // 'function' to allow `this.t
imeout` |
| 742 this.enableTimeouts(false); |
| 743 // Suppress mocha on-error handling because it will mess up unittests. |
| 744 mochaOnError = window.onerror; |
| 745 window.onerror = function(err, url, line) { |
| 746 console.error(err, url, line); |
| 747 }; |
| 748 window.addEventListener('message', (event) => { |
| 749 if (event.data == 'unittest-suite-done') { |
| 750 window.console.log("Done running unittests"); |
| 751 let output = document.body.textContent; |
| 752 // Restore the Mocha onerror handler in case future tests need to run. |
| 753 window.onerror = mochaOnError; |
| 754 this.enableTimeouts(true); |
| 755 |
| 756 var matches = output.match(/ERROR/g); |
| 757 let numErrors = matches ? matches.length : 0; |
| 758 if (numErrors != num_expected_unittest_errors) { |
| 759 output = "Expected " + num_expected_unittest_errors + |
| 760 " failing unittests, got " + numErrors + ".\n" + output; |
| 761 console.error(output); |
| 762 done(new Error(output)); |
| 763 } else { |
| 764 console.log(output); |
| 765 done(); |
| 766 } |
| 767 } |
| 768 }); |
| 769 |
| 770 for (let action of unittest_tests) { |
| 771 try { |
| 772 action(); |
| 773 } catch (e) { |
| 774 console.error("Caught error tying to setup test:", e); |
| 775 } |
| 776 } |
| 777 }); |
567 })(); | 778 })(); |
OLD | NEW |