3 # Any copyright is dedicated to the Public Domain.
4 # http://creativecommons.org/publicdomain/zero/1.0/
7 from __future__
import absolute_import
, print_function
19 from mozlog
import structured
21 from runxpcshelltests
import XPCShellTests
24 TEST_PASS_STRING
= "TEST-PASS"
25 TEST_FAIL_STRING
= "TEST-UNEXPECTED-FAIL"
27 SIMPLE_PASSING_TEST
= "function run_test() { Assert.ok(true); }"
28 SIMPLE_FAILING_TEST
= "function run_test() { Assert.ok(false); }"
29 SIMPLE_PREFCHECK_TEST
= """
31 const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
32 Assert.ok(Services.prefs.getBoolPref("fake.pref.to.test"));
36 SIMPLE_UNCAUGHT_REJECTION_TEST
= """
38 Promise.reject(new Error("Test rejection."));
43 SIMPLE_UNCAUGHT_REJECTION_JSM_TEST
= """
44 Components.utils.import("resource://gre/modules/Promise.jsm");
46 Promise.reject(new Error("Test rejection."));
54 function run_test() { run_next_test(); }
56 add_test(function test_simple() {
62 ADD_TEST_FAILING
= """
63 function run_test() { run_next_test(); }
65 add_test(function test_failing() {
71 ADD_TEST_UNCAUGHT_REJECTION
= """
72 function run_test() { run_next_test(); }
74 add_test(function test_uncaught_rejection() {
75 Promise.reject(new Error("Test rejection."));
80 ADD_TEST_UNCAUGHT_REJECTION_JSM
= """
81 Components.utils.import("resource://gre/modules/Promise.jsm");
83 function run_test() { run_next_test(); }
85 add_test(function test_uncaught_rejection() {
86 Promise.reject(new Error("Test rejection."));
91 CHILD_TEST_PASSING
= """
92 function run_test () { run_next_test(); }
94 add_test(function test_child_simple () {
95 run_test_in_child("test_pass.js");
100 CHILD_TEST_FAILING
= """
101 function run_test () { run_next_test(); }
103 add_test(function test_child_simple () {
104 run_test_in_child("test_fail.js");
109 CHILD_HARNESS_SIMPLE
= """
110 function run_test () { run_next_test(); }
112 add_test(function test_child_assert () {
113 do_load_child_test_harness();
114 do_test_pending("test child assertion");
115 sendCommand("Assert.ok(true);", do_test_finished);
120 CHILD_TEST_HANG
= """
121 function run_test () { run_next_test(); }
123 add_test(function test_child_simple () {
124 do_test_pending("hang test");
125 do_load_child_test_harness();
126 sendCommand("_testLogger.info('CHILD-TEST-STARTED'); " +
127 + "const _TEST_FILE=['test_pass.js']; _execute_test(); ",
133 SIMPLE_LOOPING_TEST
= """
134 function run_test () { run_next_test(); }
136 add_test(function test_loop () {
141 PASSING_TEST_UNICODE
= b
"""
142 function run_test () { run_next_test(); }
144 add_test(function test_unicode_print () {
145 Assert.equal("\u201c\u201d", "\u201c\u201d");
150 ADD_TASK_SINGLE
= """
151 Components.utils.import("resource://gre/modules/Promise.jsm");
153 function run_test() { run_next_test(); }
155 add_task(async function test_task() {
156 await Promise.resolve(true);
157 await Promise.resolve(false);
161 ADD_TASK_MULTIPLE
= """
162 Components.utils.import("resource://gre/modules/Promise.jsm");
164 function run_test() { run_next_test(); }
166 add_task(async function test_task() {
167 await Promise.resolve(true);
170 add_task(async function test_2() {
171 await Promise.resolve(true);
175 ADD_TASK_REJECTED
= """
176 Components.utils.import("resource://gre/modules/Promise.jsm");
178 function run_test() { run_next_test(); }
180 add_task(async function test_failing() {
181 await Promise.reject(new Error("I fail."));
185 ADD_TASK_FAILURE_INSIDE
= """
186 Components.utils.import("resource://gre/modules/Promise.jsm");
188 function run_test() { run_next_test(); }
190 add_task(async function test() {
191 let result = await Promise.resolve(false);
197 ADD_TASK_RUN_NEXT_TEST
= """
198 function run_test() { run_next_test(); }
200 add_task(function () {
207 ADD_TASK_STACK_TRACE
= """
208 Components.utils.import("resource://gre/modules/Promise.jsm", this);
210 function run_test() { run_next_test(); }
212 add_task(async function this_test_will_fail() {
213 for (let i = 0; i < 10; ++i) {
214 await Promise.resolve();
221 add_task(async function skipMeNot1() {
222 Assert.ok(true, "Well well well.");
225 add_task(async function skipMe1() {
226 Assert.ok(false, "Not skipped after all.");
229 add_task(async function skipMeNot2() {
230 Assert.ok(true, "Well well well.");
233 add_task(async function skipMeNot3() {
234 Assert.ok(true, "Well well well.");
237 add_task(async function skipMe2() {
238 Assert.ok(false, "Not skipped after all.");
242 ADD_TASK_SKIPALL
= """
243 add_task(async function skipMe1() {
244 Assert.ok(false, "Not skipped after all.");
247 add_task(async function skipMe2() {
248 Assert.ok(false, "Not skipped after all.");
251 add_task(async function skipMe3() {
252 Assert.ok(false, "Not skipped after all.");
255 add_task(async function skipMeNot() {
256 Assert.ok(true, "Well well well.");
259 add_task(async function skipMe4() {
260 Assert.ok(false, "Not skipped after all.");
264 ADD_TEST_THROW_STRING
= """
265 function run_test() {do_throw("Passing a string to do_throw")};
268 ADD_TEST_THROW_OBJECT
= """
270 message: "Error object",
271 fileName: "failure.js",
272 stack: "ERROR STACK",
273 toString: function() {return this.message;}
275 function run_test() {do_throw(error)};
278 ADD_TEST_REPORT_OBJECT
= """
280 message: "Error object",
281 fileName: "failure.js",
282 stack: "ERROR STACK",
283 toString: function() {return this.message;}
285 function run_test() {do_report_unexpected_exception(error)};
288 ADD_TEST_VERBOSE
= """
289 function run_test() {info("a message from info")};
292 # A test for genuine JS-generated Error objects
293 ADD_TEST_REPORT_REF_ERROR
= """
294 function run_test() {
297 obj.noSuchFunction();
300 do_report_unexpected_exception(error);
305 # A test for failure to load a test due to a syntax error
306 LOAD_ERROR_SYNTAX_ERROR
= """
310 # A test for failure to load a test due to an error other than a syntax error
311 LOAD_ERROR_OTHER_ERROR
= """
313 no_such_var = "foo"; // assignment to undeclared variable
316 # A test that crashes outright.
318 function run_test () {
319 Components.utils.import("resource://gre/modules/ctypes.jsm", this);
320 let zero = new ctypes.intptr_t(8);
321 let badptr = ctypes.cast(zero, ctypes.PointerType(ctypes.int32_t));
326 # A test for asynchronous cleanup functions
328 function run_test() {
329 Components.utils.import("resource://gre/modules/Promise.jsm", this);
331 // The list of checkpoints in the order we encounter them.
332 let checkpoints = [];
334 // Cleanup tasks, in reverse order
335 registerCleanupFunction(function cleanup_checkout() {
336 Assert.equal(checkpoints.join(""), "123456");
337 info("At this stage, the test has succeeded");
338 do_throw("Throwing an error to force displaying the log");
341 registerCleanupFunction(function sync_cleanup_2() {
345 registerCleanupFunction(async function async_cleanup_4() {
350 registerCleanupFunction(async function async_cleanup_3() {
355 registerCleanupFunction(function async_cleanup_2() {
356 let deferred = Promise.defer();
357 executeSoon(deferred.resolve);
358 return deferred.promise.then(function() {
363 registerCleanupFunction(function sync_cleanup() {
367 registerCleanupFunction(function async_cleanup() {
368 let deferred = Promise.defer();
369 executeSoon(deferred.resolve);
370 return deferred.promise.then(function() {
378 # A test to check that add_test() tests run without run_test()
379 NO_RUN_TEST_ADD_TEST
= """
380 add_test(function no_run_test_add_test() {
386 # A test to check that add_task() tests run without run_test()
387 NO_RUN_TEST_ADD_TASK
= """
388 add_task(function no_run_test_add_task() {
393 # A test to check that both add_task() and add_test() work without run_test()
394 NO_RUN_TEST_ADD_TEST_ADD_TASK
= """
395 add_test(function no_run_test_add_test() {
400 add_task(function no_run_test_add_task() {
405 # A test to check that an empty test file without run_test(),
406 # add_test() or add_task() works.
407 NO_RUN_TEST_EMPTY_TEST
= """
408 // This is an empty test file.
411 NO_RUN_TEST_ADD_TEST_FAIL
= """
412 add_test(function no_run_test_add_test_fail() {
418 NO_RUN_TEST_ADD_TASK_FAIL
= """
419 add_task(function no_run_test_add_task_fail() {
424 NO_RUN_TEST_ADD_TASK_MULTIPLE
= """
425 Components.utils.import("resource://gre/modules/Promise.jsm");
427 add_task(async function test_task() {
428 await Promise.resolve(true);
431 add_task(async function test_2() {
432 await Promise.resolve(true);
437 function run_test() {
438 Assert.notEqual(typeof mozinfo, undefined);
439 Assert.notEqual(typeof mozinfo.os, undefined);
444 function run_test () { run_next_test(); }
446 add_test(function test_child_mozinfo () {
447 run_test_in_child("test_mozinfo.js");
453 add_task(function headless_true() {
454 let env = Cc["@mozilla.org/process/environment;1"].getService(
457 Assert.equal(env.get("MOZ_HEADLESS"), "1", "Check MOZ_HEADLESS");
458 Assert.equal(env.get("DISPLAY"), "77", "Check DISPLAY");
463 add_task(function headless_false() {
464 let env = Cc["@mozilla.org/process/environment;1"].getService(
467 Assert.notEqual(env.get("MOZ_HEADLESS"), "1", "Check MOZ_HEADLESS");
468 Assert.notEqual(env.get("DISPLAY"), "77", "Check DISPLAY");
473 class XPCShellTestsTests(unittest
.TestCase
):
475 Yes, these are unit tests for a unit test harness.
478 def __init__(self
, name
):
479 super(XPCShellTestsTests
, self
).__init
__(name
)
480 from buildconfig
import substs
481 from mozbuild
.base
import MozbuildObject
483 os
.environ
.pop("MOZ_OBJDIR", None)
484 self
.build_obj
= MozbuildObject
.from_environment()
486 objdir
= self
.build_obj
.topobjdir
487 self
.testing_modules
= os
.path
.join(objdir
, "_tests", "modules")
490 self
.xpcshellBin
= os
.path
.join(
493 substs
["MOZ_MACBUNDLE_NAME"],
499 self
.xpcshellBin
= os
.path
.join(objdir
, "dist", "bin", "xpcshell")
500 if sys
.platform
== "win32":
501 self
.xpcshellBin
+= ".exe"
502 self
.utility_path
= os
.path
.join(objdir
, "dist", "bin")
503 self
.symbols_path
= None
504 candidate_path
= os
.path
.join(self
.build_obj
.distdir
, "crashreporter-symbols")
505 if os
.path
.isdir(candidate_path
):
506 self
.symbols_path
= candidate_path
509 self
.log
= six
.StringIO()
510 self
.tempdir
= tempfile
.mkdtemp()
511 logger
= structured
.commandline
.setup_logging(
512 "selftest%s" % id(self
), {}, {"tbpl": self
.log
}
514 self
.x
= XPCShellTests(logger
)
515 self
.x
.harness_timeout
= 30 if not mozinfo
.info
["ccov"] else 60
518 shutil
.rmtree(self
.tempdir
)
519 self
.x
.shutdownNode()
521 def writeFile(self
, name
, contents
, mode
="w"):
523 Write |contents| to a file named |name| in the temp directory,
524 and return the full path to the file.
526 fullpath
= os
.path
.join(self
.tempdir
, name
)
527 with
open(fullpath
, mode
) as f
:
531 def writeManifest(self
, tests
, prefs
=[]):
533 Write an xpcshell.ini in the temp directory and set
534 self.manifest to its pathname. |tests| is a list containing
535 either strings (for test names), or tuples with a test name
536 as the first element and manifest conditions as the following
537 elements. |prefs| is an optional list of prefs in the form of
538 "prefname=prefvalue" strings.
542 testlines
.append("[%s]" % (t
if isinstance(t
, six
.string_types
) else t
[0]))
543 if isinstance(t
, tuple):
544 testlines
.extend(t
[1:])
547 # Append prefs lines as indented inside "prefs=" manifest option.
548 prefslines
.append(" %s" % p
)
550 self
.manifest
= self
.writeFile(
558 + "\n".join(prefslines
)
560 + "\n".join(testlines
),
563 def assertTestResult(self
, expected
, shuffle
=False, verbose
=False, headless
=False):
565 Assert that self.x.runTests with manifest=self.manifest
569 kwargs
["xpcshell"] = self
.xpcshellBin
570 kwargs
["symbolsPath"] = self
.symbols_path
571 kwargs
["manifest"] = self
.manifest
572 kwargs
["mozInfo"] = mozinfo
.info
573 kwargs
["shuffle"] = shuffle
574 kwargs
["verbose"] = verbose
575 kwargs
["headless"] = headless
576 kwargs
["sequential"] = True
577 kwargs
["testingModulesDir"] = self
.testing_modules
578 kwargs
["utility_path"] = self
.utility_path
581 self
.x
.runTests(kwargs
),
582 msg
="""Tests should have %s, log:
587 % ("passed" if expected
else "failed", self
.log
.getvalue()),
590 def _assertLog(self
, s
, expected
):
591 l
= self
.log
.getvalue()
595 msg
="""Value %s %s in log:
599 % (s
, "expected" if expected
else "not expected", l
),
602 def assertInLog(self
, s
):
604 Assert that the string |s| is contained in self.log.
606 self
._assertLog
(s
, True)
608 def assertNotInLog(self
, s
):
610 Assert that the string |s| is not contained in self.log.
612 self
._assertLog
(s
, False)
616 Check that a simple test without any manifest conditions passes.
618 self
.writeFile("test_basic.js", SIMPLE_PASSING_TEST
)
619 self
.writeManifest(["test_basic.js"])
621 self
.assertTestResult(True)
622 self
.assertEquals(1, self
.x
.testCount
)
623 self
.assertEquals(1, self
.x
.passCount
)
624 self
.assertEquals(0, self
.x
.failCount
)
625 self
.assertEquals(0, self
.x
.todoCount
)
626 self
.assertInLog(TEST_PASS_STRING
)
627 self
.assertNotInLog(TEST_FAIL_STRING
)
631 Check that a simple failing test without any manifest conditions fails.
633 self
.writeFile("test_basic.js", SIMPLE_FAILING_TEST
)
634 self
.writeManifest(["test_basic.js"])
636 self
.assertTestResult(False)
637 self
.assertEquals(1, self
.x
.testCount
)
638 self
.assertEquals(0, self
.x
.passCount
)
639 self
.assertEquals(1, self
.x
.failCount
)
640 self
.assertEquals(0, self
.x
.todoCount
)
641 self
.assertInLog(TEST_FAIL_STRING
)
642 self
.assertNotInLog(TEST_PASS_STRING
)
644 def testPrefsInManifestVerbose(self
):
646 Check prefs configuration option is supported in xpcshell manifests.
648 self
.writeFile("test_prefs.js", SIMPLE_PREFCHECK_TEST
)
649 self
.writeManifest(tests
=["test_prefs.js"], prefs
=["fake.pref.to.test=true"])
651 self
.assertTestResult(True, verbose
=True)
652 self
.assertInLog(TEST_PASS_STRING
)
653 self
.assertNotInLog(TEST_FAIL_STRING
)
654 self
.assertEquals(1, self
.x
.testCount
)
655 self
.assertEquals(1, self
.x
.passCount
)
656 self
.assertInLog("Per-test extra prefs will be set:")
657 self
.assertInLog("fake.pref.to.test=true")
659 def testPrefsInManifestNonVerbose(self
):
661 Check prefs configuration are not logged in non verbose mode.
663 self
.writeFile("test_prefs.js", SIMPLE_PREFCHECK_TEST
)
664 self
.writeManifest(tests
=["test_prefs.js"], prefs
=["fake.pref.to.test=true"])
666 self
.assertTestResult(True, verbose
=False)
667 self
.assertNotInLog("Per-test extra prefs will be set:")
668 self
.assertNotInLog("fake.pref.to.test=true")
671 mozinfo
.isWin
or not mozinfo
.info
.get("debug"),
672 "We don't have a stack fixer on hand for windows.",
674 def testAssertStack(self
):
676 When an assertion is hit, we should produce a useful stack.
681 add_test(function test_asserts_immediately() {
682 Components.classes["@mozilla.org/xpcom/debug;1"]
683 .getService(Components.interfaces.nsIDebug2)
684 .assertion("foo", "assertion failed", "test.js", 1)
690 self
.writeManifest(["test_assert.js"])
691 self
.assertTestResult(False)
693 self
.assertInLog("###!!! ASSERTION")
694 log_lines
= self
.log
.getvalue().splitlines()
696 unknown_pat
= "#\d\d\: \?\?\?\[.* \+0x[a-f0-9]+\]"
698 any(re
.search(unknown_pat
, line
) for line
in log_lines
),
699 "An stack frame without symbols was found in\n%s"
700 % pprint
.pformat(log_lines
),
703 any(re
.search(line_pat
, line
) for line
in log_lines
),
704 "No line resembling a stack frame was found in\n%s"
705 % pprint
.pformat(log_lines
),
708 def testChildPass(self
):
710 Check that a simple test running in a child process passes.
712 self
.writeFile("test_pass.js", SIMPLE_PASSING_TEST
)
713 self
.writeFile("test_child_pass.js", CHILD_TEST_PASSING
)
714 self
.writeManifest(["test_child_pass.js"])
716 self
.assertTestResult(True, verbose
=True)
717 self
.assertEquals(1, self
.x
.testCount
)
718 self
.assertEquals(1, self
.x
.passCount
)
719 self
.assertEquals(0, self
.x
.failCount
)
720 self
.assertEquals(0, self
.x
.todoCount
)
721 self
.assertInLog(TEST_PASS_STRING
)
722 self
.assertInLog("CHILD-TEST-STARTED")
723 self
.assertInLog("CHILD-TEST-COMPLETED")
724 self
.assertNotInLog(TEST_FAIL_STRING
)
726 def testChildFail(self
):
728 Check that a simple failing test running in a child process fails.
730 self
.writeFile("test_fail.js", SIMPLE_FAILING_TEST
)
731 self
.writeFile("test_child_fail.js", CHILD_TEST_FAILING
)
732 self
.writeManifest(["test_child_fail.js"])
734 self
.assertTestResult(False)
735 self
.assertEquals(1, self
.x
.testCount
)
736 self
.assertEquals(0, self
.x
.passCount
)
737 self
.assertEquals(1, self
.x
.failCount
)
738 self
.assertEquals(0, self
.x
.todoCount
)
739 self
.assertInLog(TEST_FAIL_STRING
)
740 self
.assertInLog("CHILD-TEST-STARTED")
741 self
.assertInLog("CHILD-TEST-COMPLETED")
742 self
.assertNotInLog(TEST_PASS_STRING
)
744 def testChildHang(self
):
746 Check that incomplete output from a child process results in a
749 self
.writeFile("test_pass.js", SIMPLE_PASSING_TEST
)
750 self
.writeFile("test_child_hang.js", CHILD_TEST_HANG
)
751 self
.writeManifest(["test_child_hang.js"])
753 self
.assertTestResult(False)
754 self
.assertEquals(1, self
.x
.testCount
)
755 self
.assertEquals(0, self
.x
.passCount
)
756 self
.assertEquals(1, self
.x
.failCount
)
757 self
.assertEquals(0, self
.x
.todoCount
)
758 self
.assertInLog(TEST_FAIL_STRING
)
759 self
.assertInLog("CHILD-TEST-STARTED")
760 self
.assertNotInLog("CHILD-TEST-COMPLETED")
761 self
.assertNotInLog(TEST_PASS_STRING
)
765 Checks that calling do_load_child_test_harness without run_test_in_child
766 results in a usable test state. This test has a spurious failure when
767 run using |mach python-test|. See bug 1103226.
769 self
.writeFile("test_child_assertions.js", CHILD_HARNESS_SIMPLE
)
770 self
.writeManifest(["test_child_assertions.js"])
772 self
.assertTestResult(True)
773 self
.assertEquals(1, self
.x
.testCount
)
774 self
.assertEquals(1, self
.x
.passCount
)
775 self
.assertEquals(0, self
.x
.failCount
)
776 self
.assertEquals(0, self
.x
.todoCount
)
777 self
.assertInLog(TEST_PASS_STRING
)
778 self
.assertNotInLog(TEST_FAIL_STRING
)
780 def testSkipForAddTest(self
):
782 Check that add_test is skipped if |skip_if| condition is true
789 }, function test_should_be_skipped() {
795 self
.writeManifest(["test_skip.js"])
796 self
.assertTestResult(True, verbose
=True)
797 self
.assertEquals(1, self
.x
.testCount
)
798 self
.assertEquals(1, self
.x
.passCount
)
799 self
.assertEquals(0, self
.x
.failCount
)
800 self
.assertEquals(0, self
.x
.todoCount
)
801 self
.assertInLog(TEST_PASS_STRING
)
802 self
.assertInLog("TEST-SKIP")
803 self
.assertNotInLog(TEST_FAIL_STRING
)
805 def testNotSkipForAddTask(self
):
807 Check that add_task is not skipped if |skip_if| condition is false
813 skip_if: () => false,
814 }, function test_should_not_be_skipped() {
819 self
.writeManifest(["test_not_skip.js"])
820 self
.assertTestResult(True, verbose
=True)
821 self
.assertEquals(1, self
.x
.testCount
)
822 self
.assertEquals(1, self
.x
.passCount
)
823 self
.assertEquals(0, self
.x
.failCount
)
824 self
.assertEquals(0, self
.x
.todoCount
)
825 self
.assertInLog(TEST_PASS_STRING
)
826 self
.assertNotInLog("TEST-SKIP")
827 self
.assertNotInLog(TEST_FAIL_STRING
)
829 def testSkipForAddTask(self
):
831 Check that add_task is skipped if |skip_if| condition is true
838 }, function test_should_be_skipped() {
843 self
.writeManifest(["test_skip.js"])
844 self
.assertTestResult(True, verbose
=True)
845 self
.assertEquals(1, self
.x
.testCount
)
846 self
.assertEquals(1, self
.x
.passCount
)
847 self
.assertEquals(0, self
.x
.failCount
)
848 self
.assertEquals(0, self
.x
.todoCount
)
849 self
.assertInLog(TEST_PASS_STRING
)
850 self
.assertInLog("TEST-SKIP")
851 self
.assertNotInLog(TEST_FAIL_STRING
)
853 def testNotSkipForAddTest(self
):
855 Check that add_test is not skipped if |skip_if| condition is false
861 skip_if: () => false,
862 }, function test_should_not_be_skipped() {
868 self
.writeManifest(["test_not_skip.js"])
869 self
.assertTestResult(True, verbose
=True)
870 self
.assertEquals(1, self
.x
.testCount
)
871 self
.assertEquals(1, self
.x
.passCount
)
872 self
.assertEquals(0, self
.x
.failCount
)
873 self
.assertEquals(0, self
.x
.todoCount
)
874 self
.assertInLog(TEST_PASS_STRING
)
875 self
.assertNotInLog("TEST-SKIP")
876 self
.assertNotInLog(TEST_FAIL_STRING
)
878 def testSyntaxError(self
):
880 Check that running a test file containing a syntax error produces
881 a test failure and expected output.
883 self
.writeFile("test_syntax_error.js", '"')
884 self
.writeManifest(["test_syntax_error.js"])
886 self
.assertTestResult(False, verbose
=True)
887 self
.assertEquals(1, self
.x
.testCount
)
888 self
.assertEquals(0, self
.x
.passCount
)
889 self
.assertEquals(1, self
.x
.failCount
)
890 self
.assertEquals(0, self
.x
.todoCount
)
891 self
.assertInLog(TEST_FAIL_STRING
)
892 self
.assertNotInLog(TEST_PASS_STRING
)
894 def testUnicodeInAssertMethods(self
):
896 Check that passing unicode characters through an assertion method works.
898 self
.writeFile("test_unicode_assert.js", PASSING_TEST_UNICODE
, mode
="wb")
899 self
.writeManifest(["test_unicode_assert.js"])
901 self
.assertTestResult(True, verbose
=True)
904 "MOZ_AUTOMATION" in os
.environ
,
905 "Timeout code path occasionally times out (bug 1098121)",
907 def testHangingTimeout(self
):
909 Check that a test that never finishes results in the correct error log.
911 self
.writeFile("test_loop.js", SIMPLE_LOOPING_TEST
)
912 self
.writeManifest(["test_loop.js"])
914 old_timeout
= self
.x
.harness_timeout
915 self
.x
.harness_timeout
= 1
917 self
.assertTestResult(False)
918 self
.assertEquals(1, self
.x
.testCount
)
919 self
.assertEquals(1, self
.x
.failCount
)
920 self
.assertEquals(0, self
.x
.passCount
)
921 self
.assertEquals(0, self
.x
.todoCount
)
922 self
.assertInLog("TEST-UNEXPECTED-TIMEOUT")
924 self
.x
.harness_timeout
= old_timeout
926 def testPassFail(self
):
928 Check that running more than one test works.
930 self
.writeFile("test_pass.js", SIMPLE_PASSING_TEST
)
931 self
.writeFile("test_fail.js", SIMPLE_FAILING_TEST
)
932 self
.writeManifest(["test_pass.js", "test_fail.js"])
934 self
.assertTestResult(False)
935 self
.assertEquals(2, self
.x
.testCount
)
936 self
.assertEquals(1, self
.x
.passCount
)
937 self
.assertEquals(1, self
.x
.failCount
)
938 self
.assertEquals(0, self
.x
.todoCount
)
939 self
.assertInLog(TEST_PASS_STRING
)
940 self
.assertInLog(TEST_FAIL_STRING
)
944 Check that a simple failing test skipped in the manifest does
947 self
.writeFile("test_basic.js", SIMPLE_FAILING_TEST
)
948 self
.writeManifest([("test_basic.js", "skip-if = true")])
949 self
.assertTestResult(True)
950 self
.assertEquals(1, self
.x
.testCount
)
951 self
.assertEquals(0, self
.x
.passCount
)
952 self
.assertEquals(0, self
.x
.failCount
)
953 self
.assertEquals(0, self
.x
.todoCount
)
954 self
.assertNotInLog(TEST_FAIL_STRING
)
955 self
.assertNotInLog(TEST_PASS_STRING
)
957 def testKnownFail(self
):
959 Check that a simple failing test marked as known-fail in the manifest
960 does not cause failure.
962 self
.writeFile("test_basic.js", SIMPLE_FAILING_TEST
)
963 self
.writeManifest([("test_basic.js", "fail-if = true")])
964 self
.assertTestResult(True)
965 self
.assertEquals(1, self
.x
.testCount
)
966 self
.assertEquals(0, self
.x
.passCount
)
967 self
.assertEquals(0, self
.x
.failCount
)
968 self
.assertEquals(1, self
.x
.todoCount
)
969 self
.assertInLog("TEST-FAIL")
970 # This should be suppressed because the harness doesn't include
971 # the full log from the xpcshell run when things pass.
972 self
.assertNotInLog(TEST_FAIL_STRING
)
973 self
.assertNotInLog(TEST_PASS_STRING
)
975 def testUnexpectedPass(self
):
977 Check that a simple failing test marked as known-fail in the manifest
978 that passes causes an unexpected pass.
980 self
.writeFile("test_basic.js", SIMPLE_PASSING_TEST
)
981 self
.writeManifest([("test_basic.js", "fail-if = true")])
982 self
.assertTestResult(False)
983 self
.assertEquals(1, self
.x
.testCount
)
984 self
.assertEquals(0, self
.x
.passCount
)
985 self
.assertEquals(1, self
.x
.failCount
)
986 self
.assertEquals(0, self
.x
.todoCount
)
987 # From the outer (Python) harness
988 self
.assertInLog("TEST-UNEXPECTED-PASS")
989 self
.assertNotInLog("TEST-KNOWN-FAIL")
991 def testReturnNonzero(self
):
993 Check that a test where xpcshell returns nonzero fails.
995 self
.writeFile("test_error.js", "throw 'foo'")
996 self
.writeManifest(["test_error.js"])
998 self
.assertTestResult(False)
999 self
.assertEquals(1, self
.x
.testCount
)
1000 self
.assertEquals(0, self
.x
.passCount
)
1001 self
.assertEquals(1, self
.x
.failCount
)
1002 self
.assertEquals(0, self
.x
.todoCount
)
1003 self
.assertInLog(TEST_FAIL_STRING
)
1004 self
.assertNotInLog(TEST_PASS_STRING
)
1006 def testUncaughtRejection(self
):
1008 Ensure a simple test with an uncaught rejection is reported.
1011 "test_simple_uncaught_rejection.js", SIMPLE_UNCAUGHT_REJECTION_TEST
1013 self
.writeManifest(["test_simple_uncaught_rejection.js"])
1015 self
.assertTestResult(False)
1016 self
.assertInLog(TEST_FAIL_STRING
)
1017 self
.assertInLog("test_simple_uncaught_rejection.js:3:18")
1018 self
.assertInLog("Test rejection.")
1019 self
.assertEquals(1, self
.x
.testCount
)
1020 self
.assertEquals(0, self
.x
.passCount
)
1021 self
.assertEquals(1, self
.x
.failCount
)
1023 def testUncaughtRejectionJSM(self
):
1025 Ensure a simple test with an uncaught rejection from Promise.jsm is reported.
1028 "test_simple_uncaught_rejection_jsm.js", SIMPLE_UNCAUGHT_REJECTION_JSM_TEST
1030 self
.writeManifest(["test_simple_uncaught_rejection_jsm.js"])
1032 self
.assertTestResult(False)
1033 self
.assertInLog(TEST_FAIL_STRING
)
1034 self
.assertInLog("test_simple_uncaught_rejection_jsm.js:4:16")
1035 self
.assertInLog("Test rejection.")
1036 self
.assertEquals(1, self
.x
.testCount
)
1037 self
.assertEquals(0, self
.x
.passCount
)
1038 self
.assertEquals(1, self
.x
.failCount
)
1040 def testAddTestSimple(self
):
1042 Ensure simple add_test() works.
1044 self
.writeFile("test_add_test_simple.js", ADD_TEST_SIMPLE
)
1045 self
.writeManifest(["test_add_test_simple.js"])
1047 self
.assertTestResult(True)
1048 self
.assertEquals(1, self
.x
.testCount
)
1049 self
.assertEquals(1, self
.x
.passCount
)
1050 self
.assertEquals(0, self
.x
.failCount
)
1052 def testCrashLogging(self
):
1054 Test that a crashing test process logs a failure.
1056 self
.writeFile("test_crashes.js", TEST_CRASHING
)
1057 self
.writeManifest(["test_crashes.js"])
1059 self
.assertTestResult(False)
1060 self
.assertEquals(1, self
.x
.testCount
)
1061 self
.assertEquals(0, self
.x
.passCount
)
1062 self
.assertEquals(1, self
.x
.failCount
)
1063 if mozinfo
.info
.get("crashreporter"):
1064 self
.assertInLog("\nPROCESS-CRASH")
1066 def testLogCorrectFileName(self
):
1068 Make sure a meaningful filename and line number is logged
1071 self
.writeFile("test_add_test_simple.js", ADD_TEST_SIMPLE
)
1072 self
.writeManifest(["test_add_test_simple.js"])
1074 self
.assertTestResult(True, verbose
=True)
1075 self
.assertInLog("true == true")
1076 self
.assertNotInLog("[Assert.ok :")
1077 self
.assertInLog("[test_simple : 5]")
1079 def testAddTestFailing(self
):
1081 Ensure add_test() with a failing test is reported.
1083 self
.writeFile("test_add_test_failing.js", ADD_TEST_FAILING
)
1084 self
.writeManifest(["test_add_test_failing.js"])
1086 self
.assertTestResult(False)
1087 self
.assertEquals(1, self
.x
.testCount
)
1088 self
.assertEquals(0, self
.x
.passCount
)
1089 self
.assertEquals(1, self
.x
.failCount
)
1091 def testAddTestUncaughtRejection(self
):
1093 Ensure add_test() with an uncaught rejection is reported.
1096 "test_add_test_uncaught_rejection.js", ADD_TEST_UNCAUGHT_REJECTION
1098 self
.writeManifest(["test_add_test_uncaught_rejection.js"])
1100 self
.assertTestResult(False)
1101 self
.assertEquals(1, self
.x
.testCount
)
1102 self
.assertEquals(0, self
.x
.passCount
)
1103 self
.assertEquals(1, self
.x
.failCount
)
1105 def testAddTestUncaughtRejectionJSM(self
):
1107 Ensure add_test() with an uncaught rejection from Promise.jsm is reported.
1110 "test_add_test_uncaught_rejection_jsm.js", ADD_TEST_UNCAUGHT_REJECTION_JSM
1112 self
.writeManifest(["test_add_test_uncaught_rejection_jsm.js"])
1114 self
.assertTestResult(False)
1115 self
.assertEquals(1, self
.x
.testCount
)
1116 self
.assertEquals(0, self
.x
.passCount
)
1117 self
.assertEquals(1, self
.x
.failCount
)
1119 def testAddTaskTestSingle(self
):
1121 Ensure add_test_task() with a single passing test works.
1123 self
.writeFile("test_add_task_simple.js", ADD_TASK_SINGLE
)
1124 self
.writeManifest(["test_add_task_simple.js"])
1126 self
.assertTestResult(True)
1127 self
.assertEquals(1, self
.x
.testCount
)
1128 self
.assertEquals(1, self
.x
.passCount
)
1129 self
.assertEquals(0, self
.x
.failCount
)
1131 def testAddTaskTestMultiple(self
):
1133 Ensure multiple calls to add_test_task() work as expected.
1135 self
.writeFile("test_add_task_multiple.js", ADD_TASK_MULTIPLE
)
1136 self
.writeManifest(["test_add_task_multiple.js"])
1138 self
.assertTestResult(True)
1139 self
.assertEquals(1, self
.x
.testCount
)
1140 self
.assertEquals(1, self
.x
.passCount
)
1141 self
.assertEquals(0, self
.x
.failCount
)
1143 def testAddTaskTestRejected(self
):
1145 Ensure rejected task reports as failure.
1147 self
.writeFile("test_add_task_rejected.js", ADD_TASK_REJECTED
)
1148 self
.writeManifest(["test_add_task_rejected.js"])
1150 self
.assertTestResult(False)
1151 self
.assertEquals(1, self
.x
.testCount
)
1152 self
.assertEquals(0, self
.x
.passCount
)
1153 self
.assertEquals(1, self
.x
.failCount
)
1155 def testAddTaskTestFailureInside(self
):
1157 Ensure tests inside task are reported as failures.
1159 self
.writeFile("test_add_task_failure_inside.js", ADD_TASK_FAILURE_INSIDE
)
1160 self
.writeManifest(["test_add_task_failure_inside.js"])
1162 self
.assertTestResult(False)
1163 self
.assertEquals(1, self
.x
.testCount
)
1164 self
.assertEquals(0, self
.x
.passCount
)
1165 self
.assertEquals(1, self
.x
.failCount
)
1167 def testAddTaskRunNextTest(self
):
1169 Calling run_next_test() from inside add_task() results in failure.
1171 self
.writeFile("test_add_task_run_next_test.js", ADD_TASK_RUN_NEXT_TEST
)
1172 self
.writeManifest(["test_add_task_run_next_test.js"])
1174 self
.assertTestResult(False)
1175 self
.assertEquals(1, self
.x
.testCount
)
1176 self
.assertEquals(0, self
.x
.passCount
)
1177 self
.assertEquals(1, self
.x
.failCount
)
1179 def testAddTaskStackTrace(self
):
1181 Ensuring that calling Assert.ok(false) from inside add_task()
1182 results in a human-readable stack trace.
1184 self
.writeFile("test_add_task_stack_trace.js", ADD_TASK_STACK_TRACE
)
1185 self
.writeManifest(["test_add_task_stack_trace.js"])
1187 self
.assertTestResult(False)
1188 self
.assertInLog("this_test_will_fail")
1189 self
.assertInLog("run_next_test")
1190 self
.assertInLog("run_test")
1191 self
.assertNotInLog("Task.jsm")
1193 def testAddTaskSkip(self
):
1194 self
.writeFile("test_tasks_skip.js", ADD_TASK_SKIP
)
1195 self
.writeManifest(["test_tasks_skip.js"])
1197 self
.assertTestResult(True)
1198 self
.assertEquals(1, self
.x
.testCount
)
1199 self
.assertEquals(1, self
.x
.passCount
)
1200 self
.assertEquals(0, self
.x
.failCount
)
1202 def testAddTaskSkipAll(self
):
1203 self
.writeFile("test_tasks_skipall.js", ADD_TASK_SKIPALL
)
1204 self
.writeManifest(["test_tasks_skipall.js"])
1206 self
.assertTestResult(True)
1207 self
.assertEquals(1, self
.x
.testCount
)
1208 self
.assertEquals(1, self
.x
.passCount
)
1209 self
.assertEquals(0, self
.x
.failCount
)
1211 def testMissingHeadFile(self
):
1213 Ensure that missing head file results in fatal error.
1215 self
.writeFile("test_basic.js", SIMPLE_PASSING_TEST
)
1216 self
.writeManifest([("test_basic.js", "head = missing.js")])
1221 # The actual return value is never checked because we raise.
1222 self
.assertTestResult(True)
1223 except Exception as ex
:
1225 self
.assertEquals(str(ex
)[0:9], "head file")
1227 self
.assertTrue(raised
)
1229 def testRandomExecution(self
):
1231 Check that random execution doesn't break.
1234 for i
in range(0, 10):
1235 filename
= "test_pass_%d.js" % i
1236 self
.writeFile(filename
, SIMPLE_PASSING_TEST
)
1237 manifest
.append(filename
)
1239 self
.writeManifest(manifest
)
1240 self
.assertTestResult(True, shuffle
=True)
1241 self
.assertEquals(10, self
.x
.testCount
)
1242 self
.assertEquals(10, self
.x
.passCount
)
1244 def testDoThrowString(self
):
1246 Check that do_throw produces reasonable messages when the
1247 input is a string instead of an object
1249 self
.writeFile("test_error.js", ADD_TEST_THROW_STRING
)
1250 self
.writeManifest(["test_error.js"])
1252 self
.assertTestResult(False)
1253 self
.assertInLog(TEST_FAIL_STRING
)
1254 self
.assertInLog("Passing a string to do_throw")
1255 self
.assertNotInLog(TEST_PASS_STRING
)
1257 def testDoThrowForeignObject(self
):
1259 Check that do_throw produces reasonable messages when the
1260 input is a generic object with 'filename', 'message' and 'stack' attributes
1261 but 'object instanceof Error' returns false
1263 self
.writeFile("test_error.js", ADD_TEST_THROW_OBJECT
)
1264 self
.writeManifest(["test_error.js"])
1266 self
.assertTestResult(False)
1267 self
.assertInLog(TEST_FAIL_STRING
)
1268 self
.assertInLog("failure.js")
1269 self
.assertInLog("Error object")
1270 self
.assertInLog("ERROR STACK")
1271 self
.assertNotInLog(TEST_PASS_STRING
)
1273 def testDoReportForeignObject(self
):
1275 Check that do_report_unexpected_exception produces reasonable messages when the
1276 input is a generic object with 'filename', 'message' and 'stack' attributes
1277 but 'object instanceof Error' returns false
1279 self
.writeFile("test_error.js", ADD_TEST_REPORT_OBJECT
)
1280 self
.writeManifest(["test_error.js"])
1282 self
.assertTestResult(False)
1283 self
.assertInLog(TEST_FAIL_STRING
)
1284 self
.assertInLog("failure.js")
1285 self
.assertInLog("Error object")
1286 self
.assertInLog("ERROR STACK")
1287 self
.assertNotInLog(TEST_PASS_STRING
)
1289 def testDoReportRefError(self
):
1291 Check that do_report_unexpected_exception produces reasonable messages when the
1292 input is a JS-generated Error
1294 self
.writeFile("test_error.js", ADD_TEST_REPORT_REF_ERROR
)
1295 self
.writeManifest(["test_error.js"])
1297 self
.assertTestResult(False)
1298 self
.assertInLog(TEST_FAIL_STRING
)
1299 self
.assertInLog("test_error.js")
1300 self
.assertInLog("obj.noSuchFunction is not a function")
1301 self
.assertInLog("run_test@")
1302 self
.assertNotInLog(TEST_PASS_STRING
)
1304 def testDoReportSyntaxError(self
):
1306 Check that attempting to load a test file containing a syntax error
1307 generates details of the error in the log
1309 self
.writeFile("test_error.js", LOAD_ERROR_SYNTAX_ERROR
)
1310 self
.writeManifest(["test_error.js"])
1312 self
.assertTestResult(False)
1313 self
.assertInLog(TEST_FAIL_STRING
)
1314 self
.assertInLog("test_error.js:3")
1315 self
.assertNotInLog(TEST_PASS_STRING
)
1317 def testDoReportNonSyntaxError(self
):
1319 Check that attempting to load a test file containing an error other
1320 than a syntax error generates details of the error in the log
1322 self
.writeFile("test_error.js", LOAD_ERROR_OTHER_ERROR
)
1323 self
.writeManifest(["test_error.js"])
1325 self
.assertTestResult(False)
1326 self
.assertInLog(TEST_FAIL_STRING
)
1327 self
.assertInLog("ReferenceError: assignment to undeclared variable")
1328 self
.assertInLog("test_error.js:3")
1329 self
.assertNotInLog(TEST_PASS_STRING
)
1331 def testDoPrintWhenVerboseNotExplicit(self
):
1333 Check that info() and similar calls that generate output do
1334 not have the output when not run verbosely.
1336 self
.writeFile("test_verbose.js", ADD_TEST_VERBOSE
)
1337 self
.writeManifest(["test_verbose.js"])
1339 self
.assertTestResult(True)
1340 self
.assertNotInLog("a message from info")
1342 def testDoPrintWhenVerboseExplicit(self
):
1344 Check that info() and similar calls that generate output have the
1345 output shown when run verbosely.
1347 self
.writeFile("test_verbose.js", ADD_TEST_VERBOSE
)
1348 self
.writeManifest(["test_verbose.js"])
1349 self
.assertTestResult(True, verbose
=True)
1350 self
.assertInLog("a message from info")
1352 def testDoPrintWhenVerboseInManifest(self
):
1354 Check that info() and similar calls that generate output have the
1355 output shown when 'verbose = true' is in the manifest, even when
1358 self
.writeFile("test_verbose.js", ADD_TEST_VERBOSE
)
1359 self
.writeManifest([("test_verbose.js", "verbose = true")])
1361 self
.assertTestResult(True)
1362 self
.assertInLog("a message from info")
1364 def testAsyncCleanup(self
):
1366 Check that registerCleanupFunction handles nicely async cleanup tasks
1368 self
.writeFile("test_asyncCleanup.js", ASYNC_CLEANUP
)
1369 self
.writeManifest(["test_asyncCleanup.js"])
1370 self
.assertTestResult(False)
1371 self
.assertInLog('"123456" == "123456"')
1372 self
.assertInLog("At this stage, the test has succeeded")
1373 self
.assertInLog("Throwing an error to force displaying the log")
1375 def testNoRunTestAddTest(self
):
1377 Check that add_test() works fine without run_test() in the test file.
1379 self
.writeFile("test_noRunTestAddTest.js", NO_RUN_TEST_ADD_TEST
)
1380 self
.writeManifest(["test_noRunTestAddTest.js"])
1382 self
.assertTestResult(True)
1383 self
.assertEquals(1, self
.x
.testCount
)
1384 self
.assertEquals(1, self
.x
.passCount
)
1385 self
.assertEquals(0, self
.x
.failCount
)
1386 self
.assertInLog(TEST_PASS_STRING
)
1387 self
.assertNotInLog(TEST_FAIL_STRING
)
1389 def testNoRunTestAddTask(self
):
1391 Check that add_task() works fine without run_test() in the test file.
1393 self
.writeFile("test_noRunTestAddTask.js", NO_RUN_TEST_ADD_TASK
)
1394 self
.writeManifest(["test_noRunTestAddTask.js"])
1396 self
.assertTestResult(True)
1397 self
.assertEquals(1, self
.x
.testCount
)
1398 self
.assertEquals(1, self
.x
.passCount
)
1399 self
.assertEquals(0, self
.x
.failCount
)
1400 self
.assertInLog(TEST_PASS_STRING
)
1401 self
.assertNotInLog(TEST_FAIL_STRING
)
1403 def testNoRunTestAddTestAddTask(self
):
1405 Check that both add_test() and add_task() work without run_test()
1408 self
.writeFile("test_noRunTestAddTestAddTask.js", NO_RUN_TEST_ADD_TEST_ADD_TASK
)
1409 self
.writeManifest(["test_noRunTestAddTestAddTask.js"])
1411 self
.assertTestResult(True)
1412 self
.assertEquals(1, self
.x
.testCount
)
1413 self
.assertEquals(1, self
.x
.passCount
)
1414 self
.assertEquals(0, self
.x
.failCount
)
1415 self
.assertInLog(TEST_PASS_STRING
)
1416 self
.assertNotInLog(TEST_FAIL_STRING
)
1418 def testNoRunTestEmptyTest(self
):
1420 Check that the test passes on an empty file that contains neither
1421 run_test() nor add_test(), add_task().
1423 self
.writeFile("test_noRunTestEmptyTest.js", NO_RUN_TEST_EMPTY_TEST
)
1424 self
.writeManifest(["test_noRunTestEmptyTest.js"])
1426 self
.assertTestResult(True)
1427 self
.assertEquals(1, self
.x
.testCount
)
1428 self
.assertEquals(1, self
.x
.passCount
)
1429 self
.assertEquals(0, self
.x
.failCount
)
1430 self
.assertInLog(TEST_PASS_STRING
)
1431 self
.assertNotInLog(TEST_FAIL_STRING
)
1433 def testNoRunTestAddTestFail(self
):
1435 Check that test fails on using add_test() without run_test().
1437 self
.writeFile("test_noRunTestAddTestFail.js", NO_RUN_TEST_ADD_TEST_FAIL
)
1438 self
.writeManifest(["test_noRunTestAddTestFail.js"])
1440 self
.assertTestResult(False)
1441 self
.assertEquals(1, self
.x
.testCount
)
1442 self
.assertEquals(0, self
.x
.passCount
)
1443 self
.assertEquals(1, self
.x
.failCount
)
1444 self
.assertInLog(TEST_FAIL_STRING
)
1445 self
.assertNotInLog(TEST_PASS_STRING
)
1447 def testNoRunTestAddTaskFail(self
):
1449 Check that test fails on using add_task() without run_test().
1451 self
.writeFile("test_noRunTestAddTaskFail.js", NO_RUN_TEST_ADD_TASK_FAIL
)
1452 self
.writeManifest(["test_noRunTestAddTaskFail.js"])
1454 self
.assertTestResult(False)
1455 self
.assertEquals(1, self
.x
.testCount
)
1456 self
.assertEquals(0, self
.x
.passCount
)
1457 self
.assertEquals(1, self
.x
.failCount
)
1458 self
.assertInLog(TEST_FAIL_STRING
)
1459 self
.assertNotInLog(TEST_PASS_STRING
)
1461 def testNoRunTestAddTaskMultiple(self
):
1463 Check that multple add_task() tests work without run_test().
1466 "test_noRunTestAddTaskMultiple.js", NO_RUN_TEST_ADD_TASK_MULTIPLE
1468 self
.writeManifest(["test_noRunTestAddTaskMultiple.js"])
1470 self
.assertTestResult(True)
1471 self
.assertEquals(1, self
.x
.testCount
)
1472 self
.assertEquals(1, self
.x
.passCount
)
1473 self
.assertEquals(0, self
.x
.failCount
)
1474 self
.assertInLog(TEST_PASS_STRING
)
1475 self
.assertNotInLog(TEST_FAIL_STRING
)
1477 def testMozinfo(self
):
1479 Check that mozinfo.json is loaded
1481 self
.writeFile("test_mozinfo.js", LOAD_MOZINFO
)
1482 self
.writeManifest(["test_mozinfo.js"])
1483 self
.assertTestResult(True)
1484 self
.assertEquals(1, self
.x
.testCount
)
1485 self
.assertEquals(1, self
.x
.passCount
)
1486 self
.assertEquals(0, self
.x
.failCount
)
1487 self
.assertEquals(0, self
.x
.todoCount
)
1488 self
.assertInLog(TEST_PASS_STRING
)
1489 self
.assertNotInLog(TEST_FAIL_STRING
)
1491 def testChildMozinfo(self
):
1493 Check that mozinfo.json is loaded in child process
1495 self
.writeFile("test_mozinfo.js", LOAD_MOZINFO
)
1496 self
.writeFile("test_child_mozinfo.js", CHILD_MOZINFO
)
1497 self
.writeManifest(["test_child_mozinfo.js"])
1498 self
.assertTestResult(True)
1499 self
.assertEquals(1, self
.x
.testCount
)
1500 self
.assertEquals(1, self
.x
.passCount
)
1501 self
.assertEquals(0, self
.x
.failCount
)
1502 self
.assertEquals(0, self
.x
.todoCount
)
1503 self
.assertInLog(TEST_PASS_STRING
)
1504 self
.assertNotInLog(TEST_FAIL_STRING
)
1506 def testNotHeadlessByDefault(self
):
1508 Check that the default is not headless.
1510 self
.writeFile("test_notHeadlessByDefault.js", HEADLESS_FALSE
)
1511 self
.writeManifest(["test_notHeadlessByDefault.js"])
1512 self
.assertTestResult(True)
1514 def testHeadlessWhenHeadlessExplicit(self
):
1516 Check that explicitly requesting headless works when the manifest doesn't override.
1518 self
.writeFile("test_headlessWhenExplicit.js", HEADLESS_TRUE
)
1519 self
.writeManifest(["test_headlessWhenExplicit.js"])
1520 self
.assertTestResult(True, headless
=True)
1522 def testHeadlessWhenHeadlessTrueInManifest(self
):
1524 Check that enabling headless in the manifest alone works.
1526 self
.writeFile("test_headlessWhenTrueInManifest.js", HEADLESS_TRUE
)
1527 self
.writeManifest([("test_headlessWhenTrueInManifest.js", "headless = true")])
1528 self
.assertTestResult(True)
1530 def testNotHeadlessWhenHeadlessFalseInManifest(self
):
1532 Check that the manifest entry overrides the explicit default.
1534 self
.writeFile("test_notHeadlessWhenFalseInManifest.js", HEADLESS_FALSE
)
1536 [("test_notHeadlessWhenFalseInManifest.js", "headless = false")]
1538 self
.assertTestResult(True, headless
=True)
1541 if __name__
== "__main__":
1544 mozinfo
.find_and_update_from_json()