selftest.py 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345
  1. #!/usr/bin/env python
  2. #
  3. # Any copyright is dedicated to the Public Domain.
  4. # http://creativecommons.org/publicdomain/zero/1.0/
  5. #
  6. import mozinfo
  7. import mozunit
  8. import os
  9. import pprint
  10. import re
  11. import shutil
  12. import sys
  13. import tempfile
  14. import unittest
  15. from buildconfig import substs
  16. from StringIO import StringIO
  17. from mozlog import structured
  18. from mozbuild.base import MozbuildObject
  19. os.environ.pop('MOZ_OBJDIR', None)
  20. build_obj = MozbuildObject.from_environment()
  21. from runxpcshelltests import XPCShellTests
  22. mozinfo.find_and_update_from_json()
  23. objdir = build_obj.topobjdir.encode("utf-8")
  24. if mozinfo.isMac:
  25. xpcshellBin = os.path.join(objdir, "dist", substs['MOZ_MACBUNDLE_NAME'], "Contents", "MacOS", "xpcshell")
  26. else:
  27. xpcshellBin = os.path.join(objdir, "dist", "bin", "xpcshell")
  28. if sys.platform == "win32":
  29. xpcshellBin += ".exe"
  30. TEST_PASS_STRING = "TEST-PASS"
  31. TEST_FAIL_STRING = "TEST-UNEXPECTED-FAIL"
  32. SIMPLE_PASSING_TEST = "function run_test() { do_check_true(true); }"
  33. SIMPLE_FAILING_TEST = "function run_test() { do_check_true(false); }"
  34. SIMPLE_UNCAUGHT_REJECTION_TEST = '''
  35. function run_test() {
  36. Promise.reject(new Error("Test rejection."));
  37. do_check_true(true);
  38. }
  39. '''
  40. SIMPLE_UNCAUGHT_REJECTION_JSM_TEST = '''
  41. Components.utils.import("resource://gre/modules/Promise.jsm");
  42. Promise.reject(new Error("Test rejection."));
  43. function run_test() {
  44. do_check_true(true);
  45. }
  46. '''
  47. ADD_TEST_SIMPLE = '''
  48. function run_test() { run_next_test(); }
  49. add_test(function test_simple() {
  50. do_check_true(true);
  51. run_next_test();
  52. });
  53. '''
  54. ADD_TEST_FAILING = '''
  55. function run_test() { run_next_test(); }
  56. add_test(function test_failing() {
  57. do_check_true(false);
  58. run_next_test();
  59. });
  60. '''
  61. ADD_TEST_UNCAUGHT_REJECTION = '''
  62. function run_test() { run_next_test(); }
  63. add_test(function test_uncaught_rejection() {
  64. Promise.reject(new Error("Test rejection."));
  65. run_next_test();
  66. });
  67. '''
  68. ADD_TEST_UNCAUGHT_REJECTION_JSM = '''
  69. Components.utils.import("resource://gre/modules/Promise.jsm");
  70. function run_test() { run_next_test(); }
  71. add_test(function test_uncaught_rejection() {
  72. Promise.reject(new Error("Test rejection."));
  73. run_next_test();
  74. });
  75. '''
  76. CHILD_TEST_PASSING = '''
  77. function run_test () { run_next_test(); }
  78. add_test(function test_child_simple () {
  79. run_test_in_child("test_pass.js");
  80. run_next_test();
  81. });
  82. '''
  83. CHILD_TEST_FAILING = '''
  84. function run_test () { run_next_test(); }
  85. add_test(function test_child_simple () {
  86. run_test_in_child("test_fail.js");
  87. run_next_test();
  88. });
  89. '''
  90. CHILD_HARNESS_SIMPLE = '''
  91. function run_test () { run_next_test(); }
  92. add_test(function test_child_assert () {
  93. do_load_child_test_harness();
  94. do_test_pending("test child assertion");
  95. sendCommand("Assert.ok(true);", do_test_finished);
  96. run_next_test();
  97. });
  98. '''
  99. CHILD_TEST_HANG = '''
  100. function run_test () { run_next_test(); }
  101. add_test(function test_child_simple () {
  102. do_test_pending("hang test");
  103. do_load_child_test_harness();
  104. sendCommand("_testLogger.info('CHILD-TEST-STARTED'); " +
  105. + "const _TEST_FILE=['test_pass.js']; _execute_test(); ",
  106. do_test_finished);
  107. run_next_test();
  108. });
  109. '''
  110. SIMPLE_LOOPING_TEST = '''
  111. function run_test () { run_next_test(); }
  112. add_test(function test_loop () {
  113. do_test_pending()
  114. });
  115. '''
  116. PASSING_TEST_UNICODE = '''
  117. function run_test () { run_next_test(); }
  118. add_test(function test_unicode_print () {
  119. do_check_eq("\u201c\u201d", "\u201c\u201d");
  120. run_next_test();
  121. });
  122. '''
  123. ADD_TASK_SINGLE = '''
  124. Components.utils.import("resource://gre/modules/Promise.jsm");
  125. function run_test() { run_next_test(); }
  126. add_task(function test_task() {
  127. yield Promise.resolve(true);
  128. yield Promise.resolve(false);
  129. });
  130. '''
  131. ADD_TASK_MULTIPLE = '''
  132. Components.utils.import("resource://gre/modules/Promise.jsm");
  133. function run_test() { run_next_test(); }
  134. add_task(function test_task() {
  135. yield Promise.resolve(true);
  136. });
  137. add_task(function test_2() {
  138. yield Promise.resolve(true);
  139. });
  140. '''
  141. ADD_TASK_REJECTED = '''
  142. Components.utils.import("resource://gre/modules/Promise.jsm");
  143. function run_test() { run_next_test(); }
  144. add_task(function test_failing() {
  145. yield Promise.reject(new Error("I fail."));
  146. });
  147. '''
  148. ADD_TASK_FAILURE_INSIDE = '''
  149. Components.utils.import("resource://gre/modules/Promise.jsm");
  150. function run_test() { run_next_test(); }
  151. add_task(function test() {
  152. let result = yield Promise.resolve(false);
  153. do_check_true(result);
  154. });
  155. '''
  156. ADD_TASK_RUN_NEXT_TEST = '''
  157. function run_test() { run_next_test(); }
  158. add_task(function () {
  159. Assert.ok(true);
  160. run_next_test();
  161. });
  162. '''
  163. ADD_TASK_STACK_TRACE = '''
  164. Components.utils.import("resource://gre/modules/Promise.jsm", this);
  165. function run_test() { run_next_test(); }
  166. add_task(function* this_test_will_fail() {
  167. for (let i = 0; i < 10; ++i) {
  168. yield Promise.resolve();
  169. }
  170. Assert.ok(false);
  171. });
  172. '''
  173. ADD_TASK_STACK_TRACE_WITHOUT_STAR = '''
  174. Components.utils.import("resource://gre/modules/Promise.jsm", this);
  175. function run_test() { run_next_test(); }
  176. add_task(function this_test_will_fail() {
  177. for (let i = 0; i < 10; ++i) {
  178. yield Promise.resolve();
  179. }
  180. Assert.ok(false);
  181. });
  182. '''
  183. ADD_TEST_THROW_STRING = '''
  184. function run_test() {do_throw("Passing a string to do_throw")};
  185. '''
  186. ADD_TEST_THROW_OBJECT = '''
  187. let error = {
  188. message: "Error object",
  189. fileName: "failure.js",
  190. stack: "ERROR STACK",
  191. toString: function() {return this.message;}
  192. };
  193. function run_test() {do_throw(error)};
  194. '''
  195. ADD_TEST_REPORT_OBJECT = '''
  196. let error = {
  197. message: "Error object",
  198. fileName: "failure.js",
  199. stack: "ERROR STACK",
  200. toString: function() {return this.message;}
  201. };
  202. function run_test() {do_report_unexpected_exception(error)};
  203. '''
  204. ADD_TEST_VERBOSE = '''
  205. function run_test() {do_print("a message from do_print")};
  206. '''
  207. # A test for genuine JS-generated Error objects
  208. ADD_TEST_REPORT_REF_ERROR = '''
  209. function run_test() {
  210. let obj = {blah: 0};
  211. try {
  212. obj.noSuchFunction();
  213. }
  214. catch (error) {
  215. do_report_unexpected_exception(error);
  216. }
  217. };
  218. '''
  219. # A test for failure to load a test due to a syntax error
  220. LOAD_ERROR_SYNTAX_ERROR = '''
  221. function run_test(
  222. '''
  223. # A test for failure to load a test due to an error other than a syntax error
  224. LOAD_ERROR_OTHER_ERROR = '''
  225. function run_test() {
  226. yield "foo";
  227. return "foo"; // can't use return in a generator!
  228. };
  229. '''
  230. # A test for asynchronous cleanup functions
  231. ASYNC_CLEANUP = '''
  232. function run_test() {
  233. Components.utils.import("resource://gre/modules/Promise.jsm", this);
  234. // The list of checkpoints in the order we encounter them.
  235. let checkpoints = [];
  236. // Cleanup tasks, in reverse order
  237. do_register_cleanup(function cleanup_checkout() {
  238. do_check_eq(checkpoints.join(""), "1234");
  239. do_print("At this stage, the test has succeeded");
  240. do_throw("Throwing an error to force displaying the log");
  241. });
  242. do_register_cleanup(function sync_cleanup_2() {
  243. checkpoints.push(4);
  244. });
  245. do_register_cleanup(function async_cleanup_2() {
  246. let deferred = Promise.defer();
  247. do_execute_soon(deferred.resolve);
  248. return deferred.promise.then(function() {
  249. checkpoints.push(3);
  250. });
  251. });
  252. do_register_cleanup(function sync_cleanup() {
  253. checkpoints.push(2);
  254. });
  255. do_register_cleanup(function async_cleanup() {
  256. let deferred = Promise.defer();
  257. do_execute_soon(deferred.resolve);
  258. return deferred.promise.then(function() {
  259. checkpoints.push(1);
  260. });
  261. });
  262. }
  263. '''
  264. # A test to check that add_test() tests run without run_test()
  265. NO_RUN_TEST_ADD_TEST = '''
  266. add_test(function no_run_test_add_test() {
  267. do_check_true(true);
  268. run_next_test();
  269. });
  270. '''
  271. # A test to check that add_task() tests run without run_test()
  272. NO_RUN_TEST_ADD_TASK = '''
  273. add_task(function no_run_test_add_task() {
  274. do_check_true(true);
  275. });
  276. '''
  277. # A test to check that both add_task() and add_test() work without run_test()
  278. NO_RUN_TEST_ADD_TEST_ADD_TASK = '''
  279. add_test(function no_run_test_add_test() {
  280. do_check_true(true);
  281. run_next_test();
  282. });
  283. add_task(function no_run_test_add_task() {
  284. do_check_true(true);
  285. });
  286. '''
  287. # A test to check that an empty test file without run_test(),
  288. # add_test() or add_task() works.
  289. NO_RUN_TEST_EMPTY_TEST = '''
  290. // This is an empty test file.
  291. '''
  292. NO_RUN_TEST_ADD_TEST_FAIL = '''
  293. add_test(function no_run_test_add_test_fail() {
  294. do_check_true(false);
  295. run_next_test();
  296. });
  297. '''
  298. NO_RUN_TEST_ADD_TASK_FAIL = '''
  299. add_task(function no_run_test_add_task_fail() {
  300. do_check_true(false);
  301. });
  302. '''
  303. NO_RUN_TEST_ADD_TASK_MULTIPLE = '''
  304. Components.utils.import("resource://gre/modules/Promise.jsm");
  305. add_task(function test_task() {
  306. yield Promise.resolve(true);
  307. });
  308. add_task(function test_2() {
  309. yield Promise.resolve(true);
  310. });
  311. '''
  312. LOAD_MOZINFO = '''
  313. function run_test() {
  314. do_check_neq(typeof mozinfo, undefined);
  315. do_check_neq(typeof mozinfo.os, undefined);
  316. }
  317. '''
  318. CHILD_MOZINFO = '''
  319. function run_test () { run_next_test(); }
  320. add_test(function test_child_mozinfo () {
  321. run_test_in_child("test_mozinfo.js");
  322. run_next_test();
  323. });
  324. '''
  325. class XPCShellTestsTests(unittest.TestCase):
  326. """
  327. Yes, these are unit tests for a unit test harness.
  328. """
  329. def setUp(self):
  330. self.log = StringIO()
  331. self.tempdir = tempfile.mkdtemp()
  332. self.utility_path = os.path.join(objdir, 'dist', 'bin')
  333. logger = structured.commandline.setup_logging("selftest%s" % id(self),
  334. {},
  335. {"tbpl": self.log})
  336. self.x = XPCShellTests(logger)
  337. self.x.harness_timeout = 15
  338. self.symbols_path = None
  339. candidate_path = os.path.join(build_obj.distdir, 'crashreporter-symbols')
  340. if (os.path.isdir(candidate_path)):
  341. self.symbols_path = candidate_path
  342. def tearDown(self):
  343. shutil.rmtree(self.tempdir)
  344. def writeFile(self, name, contents):
  345. """
  346. Write |contents| to a file named |name| in the temp directory,
  347. and return the full path to the file.
  348. """
  349. fullpath = os.path.join(self.tempdir, name)
  350. with open(fullpath, "w") as f:
  351. f.write(contents)
  352. return fullpath
  353. def writeManifest(self, tests):
  354. """
  355. Write an xpcshell.ini in the temp directory and set
  356. self.manifest to its pathname. |tests| is a list containing
  357. either strings (for test names), or tuples with a test name
  358. as the first element and manifest conditions as the following
  359. elements.
  360. """
  361. testlines = []
  362. for t in tests:
  363. testlines.append("[%s]" % (t if isinstance(t, basestring)
  364. else t[0]))
  365. if isinstance(t, tuple):
  366. testlines.extend(t[1:])
  367. self.manifest = self.writeFile("xpcshell.ini", """
  368. [DEFAULT]
  369. head =
  370. tail =
  371. """ + "\n".join(testlines))
  372. def assertTestResult(self, expected, shuffle=False, verbose=False):
  373. """
  374. Assert that self.x.runTests with manifest=self.manifest
  375. returns |expected|.
  376. """
  377. self.assertEquals(expected,
  378. self.x.runTests(xpcshellBin,
  379. symbolsPath=self.symbols_path,
  380. manifest=self.manifest,
  381. mozInfo=mozinfo.info,
  382. shuffle=shuffle,
  383. verbose=verbose,
  384. sequential=True,
  385. testingModulesDir=os.path.join(objdir, '_tests', 'modules'),
  386. utility_path=self.utility_path),
  387. msg="""Tests should have %s, log:
  388. ========
  389. %s
  390. ========
  391. """ % ("passed" if expected else "failed", self.log.getvalue()))
  392. def _assertLog(self, s, expected):
  393. l = self.log.getvalue()
  394. self.assertEqual(expected, s in l,
  395. msg="""Value %s %s in log:
  396. ========
  397. %s
  398. ========""" % (s, "expected" if expected else "not expected", l))
  399. def assertInLog(self, s):
  400. """
  401. Assert that the string |s| is contained in self.log.
  402. """
  403. self._assertLog(s, True)
  404. def assertNotInLog(self, s):
  405. """
  406. Assert that the string |s| is not contained in self.log.
  407. """
  408. self._assertLog(s, False)
  409. def testPass(self):
  410. """
  411. Check that a simple test without any manifest conditions passes.
  412. """
  413. self.writeFile("test_basic.js", SIMPLE_PASSING_TEST)
  414. self.writeManifest(["test_basic.js"])
  415. self.assertTestResult(True)
  416. self.assertEquals(1, self.x.testCount)
  417. self.assertEquals(1, self.x.passCount)
  418. self.assertEquals(0, self.x.failCount)
  419. self.assertEquals(0, self.x.todoCount)
  420. self.assertInLog(TEST_PASS_STRING)
  421. self.assertNotInLog(TEST_FAIL_STRING)
  422. def testFail(self):
  423. """
  424. Check that a simple failing test without any manifest conditions fails.
  425. """
  426. self.writeFile("test_basic.js", SIMPLE_FAILING_TEST)
  427. self.writeManifest(["test_basic.js"])
  428. self.assertTestResult(False)
  429. self.assertEquals(1, self.x.testCount)
  430. self.assertEquals(0, self.x.passCount)
  431. self.assertEquals(1, self.x.failCount)
  432. self.assertEquals(0, self.x.todoCount)
  433. self.assertInLog(TEST_FAIL_STRING)
  434. self.assertNotInLog(TEST_PASS_STRING)
  435. @unittest.skipIf(mozinfo.isWin or not mozinfo.info.get('debug'),
  436. 'We don\'t have a stack fixer on hand for windows.')
  437. def testAssertStack(self):
  438. """
  439. When an assertion is hit, we should produce a useful stack.
  440. """
  441. self.writeFile("test_assert.js", '''
  442. add_test(function test_asserts_immediately() {
  443. Components.classes["@mozilla.org/xpcom/debug;1"]
  444. .getService(Components.interfaces.nsIDebug2)
  445. .assertion("foo", "assertion failed", "test.js", 1)
  446. run_next_test();
  447. });
  448. ''')
  449. self.writeManifest(["test_assert.js"])
  450. self.assertTestResult(False)
  451. self.assertInLog("###!!! ASSERTION")
  452. log_lines = self.log.getvalue().splitlines()
  453. line_pat = "#\d\d:"
  454. unknown_pat = "#\d\d\: \?\?\?\[.* \+0x[a-f0-9]+\]"
  455. self.assertFalse(any(re.search(unknown_pat, line) for line in log_lines),
  456. "An stack frame without symbols was found in\n%s" % pprint.pformat(log_lines))
  457. self.assertTrue(any(re.search(line_pat, line) for line in log_lines),
  458. "No line resembling a stack frame was found in\n%s" % pprint.pformat(log_lines))
  459. def testChildPass(self):
  460. """
  461. Check that a simple test running in a child process passes.
  462. """
  463. self.writeFile("test_pass.js", SIMPLE_PASSING_TEST)
  464. self.writeFile("test_child_pass.js", CHILD_TEST_PASSING)
  465. self.writeManifest(["test_child_pass.js"])
  466. self.assertTestResult(True, verbose=True)
  467. self.assertEquals(1, self.x.testCount)
  468. self.assertEquals(1, self.x.passCount)
  469. self.assertEquals(0, self.x.failCount)
  470. self.assertEquals(0, self.x.todoCount)
  471. self.assertInLog(TEST_PASS_STRING)
  472. self.assertInLog("CHILD-TEST-STARTED")
  473. self.assertInLog("CHILD-TEST-COMPLETED")
  474. self.assertNotInLog(TEST_FAIL_STRING)
  475. def testChildFail(self):
  476. """
  477. Check that a simple failing test running in a child process fails.
  478. """
  479. self.writeFile("test_fail.js", SIMPLE_FAILING_TEST)
  480. self.writeFile("test_child_fail.js", CHILD_TEST_FAILING)
  481. self.writeManifest(["test_child_fail.js"])
  482. self.assertTestResult(False)
  483. self.assertEquals(1, self.x.testCount)
  484. self.assertEquals(0, self.x.passCount)
  485. self.assertEquals(1, self.x.failCount)
  486. self.assertEquals(0, self.x.todoCount)
  487. self.assertInLog(TEST_FAIL_STRING)
  488. self.assertInLog("CHILD-TEST-STARTED")
  489. self.assertInLog("CHILD-TEST-COMPLETED")
  490. self.assertNotInLog(TEST_PASS_STRING)
  491. def testChildHang(self):
  492. """
  493. Check that incomplete output from a child process results in a
  494. test failure.
  495. """
  496. self.writeFile("test_pass.js", SIMPLE_PASSING_TEST)
  497. self.writeFile("test_child_hang.js", CHILD_TEST_HANG)
  498. self.writeManifest(["test_child_hang.js"])
  499. self.assertTestResult(False)
  500. self.assertEquals(1, self.x.testCount)
  501. self.assertEquals(0, self.x.passCount)
  502. self.assertEquals(1, self.x.failCount)
  503. self.assertEquals(0, self.x.todoCount)
  504. self.assertInLog(TEST_FAIL_STRING)
  505. self.assertInLog("CHILD-TEST-STARTED")
  506. self.assertNotInLog("CHILD-TEST-COMPLETED")
  507. self.assertNotInLog(TEST_PASS_STRING)
  508. def testChild(self):
  509. """
  510. Checks that calling do_load_child_test_harness without run_test_in_child
  511. results in a usable test state. This test has a spurious failure when
  512. run using |mach python-test|. See bug 1103226.
  513. """
  514. self.writeFile("test_child_assertions.js", CHILD_HARNESS_SIMPLE)
  515. self.writeManifest(["test_child_assertions.js"])
  516. self.assertTestResult(True)
  517. self.assertEquals(1, self.x.testCount)
  518. self.assertEquals(1, self.x.passCount)
  519. self.assertEquals(0, self.x.failCount)
  520. self.assertEquals(0, self.x.todoCount)
  521. self.assertInLog(TEST_PASS_STRING)
  522. self.assertNotInLog(TEST_FAIL_STRING)
  523. def testSkipForAddTest(self):
  524. """
  525. Check that add_test is skipped if |skip_if| condition is true
  526. """
  527. self.writeFile("test_skip.js", """
  528. add_test({
  529. skip_if: () => true,
  530. }, function test_should_be_skipped() {
  531. do_check_true(false);
  532. run_next_test();
  533. });
  534. """)
  535. self.writeManifest(["test_skip.js"])
  536. self.assertTestResult(True, verbose=True)
  537. self.assertEquals(1, self.x.testCount)
  538. self.assertEquals(1, self.x.passCount)
  539. self.assertEquals(0, self.x.failCount)
  540. self.assertEquals(0, self.x.todoCount)
  541. self.assertInLog(TEST_PASS_STRING)
  542. self.assertInLog("TEST-SKIP")
  543. self.assertNotInLog(TEST_FAIL_STRING)
  544. def testNotSkipForAddTask(self):
  545. """
  546. Check that add_task is not skipped if |skip_if| condition is false
  547. """
  548. self.writeFile("test_not_skip.js", """
  549. add_task({
  550. skip_if: () => false,
  551. }, function test_should_not_be_skipped() {
  552. do_check_true(true);
  553. });
  554. """)
  555. self.writeManifest(["test_not_skip.js"])
  556. self.assertTestResult(True, verbose=True)
  557. self.assertEquals(1, self.x.testCount)
  558. self.assertEquals(1, self.x.passCount)
  559. self.assertEquals(0, self.x.failCount)
  560. self.assertEquals(0, self.x.todoCount)
  561. self.assertInLog(TEST_PASS_STRING)
  562. self.assertNotInLog("TEST-SKIP")
  563. self.assertNotInLog(TEST_FAIL_STRING)
  564. def testSkipForAddTask(self):
  565. """
  566. Check that add_task is skipped if |skip_if| condition is true
  567. """
  568. self.writeFile("test_skip.js", """
  569. add_task({
  570. skip_if: () => true,
  571. }, function test_should_be_skipped() {
  572. do_check_true(false);
  573. });
  574. """)
  575. self.writeManifest(["test_skip.js"])
  576. self.assertTestResult(True, verbose=True)
  577. self.assertEquals(1, self.x.testCount)
  578. self.assertEquals(1, self.x.passCount)
  579. self.assertEquals(0, self.x.failCount)
  580. self.assertEquals(0, self.x.todoCount)
  581. self.assertInLog(TEST_PASS_STRING)
  582. self.assertInLog("TEST-SKIP")
  583. self.assertNotInLog(TEST_FAIL_STRING)
  584. def testNotSkipForAddTest(self):
  585. """
  586. Check that add_test is not skipped if |skip_if| condition is false
  587. """
  588. self.writeFile("test_not_skip.js", """
  589. add_test({
  590. skip_if: () => false,
  591. }, function test_should_not_be_skipped() {
  592. do_check_true(true);
  593. run_next_test();
  594. });
  595. """)
  596. self.writeManifest(["test_not_skip.js"])
  597. self.assertTestResult(True, verbose=True)
  598. self.assertEquals(1, self.x.testCount)
  599. self.assertEquals(1, self.x.passCount)
  600. self.assertEquals(0, self.x.failCount)
  601. self.assertEquals(0, self.x.todoCount)
  602. self.assertInLog(TEST_PASS_STRING)
  603. self.assertNotInLog("TEST-SKIP")
  604. self.assertNotInLog(TEST_FAIL_STRING)
  605. def testSyntaxError(self):
  606. """
  607. Check that running a test file containing a syntax error produces
  608. a test failure and expected output.
  609. """
  610. self.writeFile("test_syntax_error.js", '"')
  611. self.writeManifest(["test_syntax_error.js"])
  612. self.assertTestResult(False, verbose=True)
  613. self.assertEquals(1, self.x.testCount)
  614. self.assertEquals(0, self.x.passCount)
  615. self.assertEquals(1, self.x.failCount)
  616. self.assertEquals(0, self.x.todoCount)
  617. self.assertInLog(TEST_FAIL_STRING)
  618. self.assertNotInLog(TEST_PASS_STRING)
  619. def testUnicodeInAssertMethods(self):
  620. """
  621. Check that passing unicode characters through an assertion method works.
  622. """
  623. self.writeFile("test_unicode_assert.js", PASSING_TEST_UNICODE)
  624. self.writeManifest(["test_unicode_assert.js"])
  625. self.assertTestResult(True, verbose=True)
  626. @unittest.skipIf('MOZ_AUTOMATION' in os.environ,
  627. 'Timeout code path occasionally times out (bug 1098121)')
  628. def testHangingTimeout(self):
  629. """
  630. Check that a test that never finishes results in the correct error log.
  631. """
  632. self.writeFile("test_loop.js", SIMPLE_LOOPING_TEST)
  633. self.writeManifest(["test_loop.js"])
  634. old_timeout = self.x.harness_timeout
  635. self.x.harness_timeout = 1
  636. self.assertTestResult(False)
  637. self.assertEquals(1, self.x.testCount)
  638. self.assertEquals(1, self.x.failCount)
  639. self.assertEquals(0, self.x.passCount)
  640. self.assertEquals(0, self.x.todoCount)
  641. self.assertInLog("TEST-UNEXPECTED-TIMEOUT")
  642. self.x.harness_timeout = old_timeout
  643. def testPassFail(self):
  644. """
  645. Check that running more than one test works.
  646. """
  647. self.writeFile("test_pass.js", SIMPLE_PASSING_TEST)
  648. self.writeFile("test_fail.js", SIMPLE_FAILING_TEST)
  649. self.writeManifest(["test_pass.js", "test_fail.js"])
  650. self.assertTestResult(False)
  651. self.assertEquals(2, self.x.testCount)
  652. self.assertEquals(1, self.x.passCount)
  653. self.assertEquals(1, self.x.failCount)
  654. self.assertEquals(0, self.x.todoCount)
  655. self.assertInLog(TEST_PASS_STRING)
  656. self.assertInLog(TEST_FAIL_STRING)
  657. def testSkip(self):
  658. """
  659. Check that a simple failing test skipped in the manifest does
  660. not cause failure.
  661. """
  662. self.writeFile("test_basic.js", SIMPLE_FAILING_TEST)
  663. self.writeManifest([("test_basic.js", "skip-if = true")])
  664. self.assertTestResult(True)
  665. self.assertEquals(1, self.x.testCount)
  666. self.assertEquals(0, self.x.passCount)
  667. self.assertEquals(0, self.x.failCount)
  668. self.assertEquals(0, self.x.todoCount)
  669. self.assertNotInLog(TEST_FAIL_STRING)
  670. self.assertNotInLog(TEST_PASS_STRING)
  671. def testKnownFail(self):
  672. """
  673. Check that a simple failing test marked as known-fail in the manifest
  674. does not cause failure.
  675. """
  676. self.writeFile("test_basic.js", SIMPLE_FAILING_TEST)
  677. self.writeManifest([("test_basic.js", "fail-if = true")])
  678. self.assertTestResult(True)
  679. self.assertEquals(1, self.x.testCount)
  680. self.assertEquals(0, self.x.passCount)
  681. self.assertEquals(0, self.x.failCount)
  682. self.assertEquals(1, self.x.todoCount)
  683. self.assertInLog("TEST-FAIL")
  684. # This should be suppressed because the harness doesn't include
  685. # the full log from the xpcshell run when things pass.
  686. self.assertNotInLog(TEST_FAIL_STRING)
  687. self.assertNotInLog(TEST_PASS_STRING)
  688. def testUnexpectedPass(self):
  689. """
  690. Check that a simple failing test marked as known-fail in the manifest
  691. that passes causes an unexpected pass.
  692. """
  693. self.writeFile("test_basic.js", SIMPLE_PASSING_TEST)
  694. self.writeManifest([("test_basic.js", "fail-if = true")])
  695. self.assertTestResult(False)
  696. self.assertEquals(1, self.x.testCount)
  697. self.assertEquals(0, self.x.passCount)
  698. self.assertEquals(1, self.x.failCount)
  699. self.assertEquals(0, self.x.todoCount)
  700. # From the outer (Python) harness
  701. self.assertInLog("TEST-UNEXPECTED-PASS")
  702. self.assertNotInLog("TEST-KNOWN-FAIL")
  703. def testReturnNonzero(self):
  704. """
  705. Check that a test where xpcshell returns nonzero fails.
  706. """
  707. self.writeFile("test_error.js", "throw 'foo'")
  708. self.writeManifest(["test_error.js"])
  709. self.assertTestResult(False)
  710. self.assertEquals(1, self.x.testCount)
  711. self.assertEquals(0, self.x.passCount)
  712. self.assertEquals(1, self.x.failCount)
  713. self.assertEquals(0, self.x.todoCount)
  714. self.assertInLog(TEST_FAIL_STRING)
  715. self.assertNotInLog(TEST_PASS_STRING)
  716. def testUncaughtRejection(self):
  717. """
  718. Ensure a simple test with an uncaught rejection is reported.
  719. """
  720. self.writeFile("test_simple_uncaught_rejection.js", SIMPLE_UNCAUGHT_REJECTION_TEST)
  721. self.writeManifest(["test_simple_uncaught_rejection.js"])
  722. self.assertTestResult(False)
  723. self.assertInLog(TEST_FAIL_STRING)
  724. if not substs.get('RELEASE_OR_BETA'):
  725. # async stacks are currently not enabled in release builds.
  726. self.assertInLog("test_simple_uncaught_rejection.js:3:3")
  727. self.assertInLog("Test rejection.")
  728. self.assertEquals(1, self.x.testCount)
  729. self.assertEquals(0, self.x.passCount)
  730. self.assertEquals(1, self.x.failCount)
  731. def testUncaughtRejectionJSM(self):
  732. """
  733. Ensure a simple test with an uncaught rejection from Promise.jsm is reported.
  734. """
  735. self.writeFile("test_simple_uncaught_rejection_jsm.js", SIMPLE_UNCAUGHT_REJECTION_JSM_TEST)
  736. self.writeManifest(["test_simple_uncaught_rejection_jsm.js"])
  737. self.assertTestResult(False)
  738. self.assertInLog(TEST_FAIL_STRING)
  739. self.assertInLog("test_simple_uncaught_rejection_jsm.js:4:16")
  740. self.assertInLog("Test rejection.")
  741. self.assertEquals(1, self.x.testCount)
  742. self.assertEquals(0, self.x.passCount)
  743. self.assertEquals(1, self.x.failCount)
  744. def testAddTestSimple(self):
  745. """
  746. Ensure simple add_test() works.
  747. """
  748. self.writeFile("test_add_test_simple.js", ADD_TEST_SIMPLE)
  749. self.writeManifest(["test_add_test_simple.js"])
  750. self.assertTestResult(True)
  751. self.assertEquals(1, self.x.testCount)
  752. self.assertEquals(1, self.x.passCount)
  753. self.assertEquals(0, self.x.failCount)
  754. def testLogCorrectFileName(self):
  755. """
  756. Make sure a meaningful filename and line number is logged
  757. by a passing test.
  758. """
  759. self.writeFile("test_add_test_simple.js", ADD_TEST_SIMPLE)
  760. self.writeManifest(["test_add_test_simple.js"])
  761. self.assertTestResult(True, verbose=True)
  762. self.assertInLog("true == true")
  763. self.assertNotInLog("[do_check_true :")
  764. self.assertInLog("[test_simple : 5]")
  765. def testAddTestFailing(self):
  766. """
  767. Ensure add_test() with a failing test is reported.
  768. """
  769. self.writeFile("test_add_test_failing.js", ADD_TEST_FAILING)
  770. self.writeManifest(["test_add_test_failing.js"])
  771. self.assertTestResult(False)
  772. self.assertEquals(1, self.x.testCount)
  773. self.assertEquals(0, self.x.passCount)
  774. self.assertEquals(1, self.x.failCount)
  775. def testAddTestUncaughtRejection(self):
  776. """
  777. Ensure add_test() with an uncaught rejection is reported.
  778. """
  779. self.writeFile("test_add_test_uncaught_rejection.js", ADD_TEST_UNCAUGHT_REJECTION)
  780. self.writeManifest(["test_add_test_uncaught_rejection.js"])
  781. self.assertTestResult(False)
  782. self.assertEquals(1, self.x.testCount)
  783. self.assertEquals(0, self.x.passCount)
  784. self.assertEquals(1, self.x.failCount)
  785. def testAddTestUncaughtRejectionJSM(self):
  786. """
  787. Ensure add_test() with an uncaught rejection from Promise.jsm is reported.
  788. """
  789. self.writeFile("test_add_test_uncaught_rejection_jsm.js", ADD_TEST_UNCAUGHT_REJECTION_JSM)
  790. self.writeManifest(["test_add_test_uncaught_rejection_jsm.js"])
  791. self.assertTestResult(False)
  792. self.assertEquals(1, self.x.testCount)
  793. self.assertEquals(0, self.x.passCount)
  794. self.assertEquals(1, self.x.failCount)
  795. def testAddTaskTestSingle(self):
  796. """
  797. Ensure add_test_task() with a single passing test works.
  798. """
  799. self.writeFile("test_add_task_simple.js", ADD_TASK_SINGLE)
  800. self.writeManifest(["test_add_task_simple.js"])
  801. self.assertTestResult(True)
  802. self.assertEquals(1, self.x.testCount)
  803. self.assertEquals(1, self.x.passCount)
  804. self.assertEquals(0, self.x.failCount)
  805. def testAddTaskTestMultiple(self):
  806. """
  807. Ensure multiple calls to add_test_task() work as expected.
  808. """
  809. self.writeFile("test_add_task_multiple.js",
  810. ADD_TASK_MULTIPLE)
  811. self.writeManifest(["test_add_task_multiple.js"])
  812. self.assertTestResult(True)
  813. self.assertEquals(1, self.x.testCount)
  814. self.assertEquals(1, self.x.passCount)
  815. self.assertEquals(0, self.x.failCount)
  816. def testAddTaskTestRejected(self):
  817. """
  818. Ensure rejected task reports as failure.
  819. """
  820. self.writeFile("test_add_task_rejected.js",
  821. ADD_TASK_REJECTED)
  822. self.writeManifest(["test_add_task_rejected.js"])
  823. self.assertTestResult(False)
  824. self.assertEquals(1, self.x.testCount)
  825. self.assertEquals(0, self.x.passCount)
  826. self.assertEquals(1, self.x.failCount)
  827. def testAddTaskTestFailureInside(self):
  828. """
  829. Ensure tests inside task are reported as failures.
  830. """
  831. self.writeFile("test_add_task_failure_inside.js",
  832. ADD_TASK_FAILURE_INSIDE)
  833. self.writeManifest(["test_add_task_failure_inside.js"])
  834. self.assertTestResult(False)
  835. self.assertEquals(1, self.x.testCount)
  836. self.assertEquals(0, self.x.passCount)
  837. self.assertEquals(1, self.x.failCount)
  838. def testAddTaskRunNextTest(self):
  839. """
  840. Calling run_next_test() from inside add_task() results in failure.
  841. """
  842. self.writeFile("test_add_task_run_next_test.js",
  843. ADD_TASK_RUN_NEXT_TEST)
  844. self.writeManifest(["test_add_task_run_next_test.js"])
  845. self.assertTestResult(False)
  846. self.assertEquals(1, self.x.testCount)
  847. self.assertEquals(0, self.x.passCount)
  848. self.assertEquals(1, self.x.failCount)
  849. def testAddTaskStackTrace(self):
  850. """
  851. Ensuring that calling Assert.ok(false) from inside add_task()
  852. results in a human-readable stack trace.
  853. """
  854. self.writeFile("test_add_task_stack_trace.js",
  855. ADD_TASK_STACK_TRACE)
  856. self.writeManifest(["test_add_task_stack_trace.js"])
  857. self.assertTestResult(False)
  858. self.assertInLog("this_test_will_fail")
  859. self.assertInLog("run_next_test")
  860. self.assertInLog("run_test")
  861. self.assertNotInLog("Task.jsm")
  862. def testAddTaskStackTraceWithoutStar(self):
  863. """
  864. Ensuring that calling Assert.ok(false) from inside add_task()
  865. results in a human-readable stack trace. This variant uses deprecated
  866. `function()` syntax instead of now standard `function*()`.
  867. """
  868. self.writeFile("test_add_task_stack_trace_without_star.js",
  869. ADD_TASK_STACK_TRACE)
  870. self.writeManifest(["test_add_task_stack_trace_without_star.js"])
  871. self.assertTestResult(False)
  872. self.assertInLog("this_test_will_fail")
  873. self.assertInLog("run_next_test")
  874. self.assertInLog("run_test")
  875. self.assertNotInLog("Task.jsm")
  876. def testMissingHeadFile(self):
  877. """
  878. Ensure that missing head file results in fatal error.
  879. """
  880. self.writeFile("test_basic.js", SIMPLE_PASSING_TEST)
  881. self.writeManifest([("test_basic.js", "head = missing.js")])
  882. raised = False
  883. try:
  884. # The actual return value is never checked because we raise.
  885. self.assertTestResult(True)
  886. except Exception, ex:
  887. raised = True
  888. self.assertEquals(ex.message[0:9], "head file")
  889. self.assertTrue(raised)
  890. def testMissingTailFile(self):
  891. """
  892. Ensure that missing tail file results in fatal error.
  893. """
  894. self.writeFile("test_basic.js", SIMPLE_PASSING_TEST)
  895. self.writeManifest([("test_basic.js", "tail = missing.js")])
  896. raised = False
  897. try:
  898. self.assertTestResult(True)
  899. except Exception, ex:
  900. raised = True
  901. self.assertEquals(ex.message[0:9], "tail file")
  902. self.assertTrue(raised)
  903. def testRandomExecution(self):
  904. """
  905. Check that random execution doesn't break.
  906. """
  907. manifest = []
  908. for i in range(0, 10):
  909. filename = "test_pass_%d.js" % i
  910. self.writeFile(filename, SIMPLE_PASSING_TEST)
  911. manifest.append(filename)
  912. self.writeManifest(manifest)
  913. self.assertTestResult(True, shuffle=True)
  914. self.assertEquals(10, self.x.testCount)
  915. self.assertEquals(10, self.x.passCount)
  916. def testDoThrowString(self):
  917. """
  918. Check that do_throw produces reasonable messages when the
  919. input is a string instead of an object
  920. """
  921. self.writeFile("test_error.js", ADD_TEST_THROW_STRING)
  922. self.writeManifest(["test_error.js"])
  923. self.assertTestResult(False)
  924. self.assertInLog(TEST_FAIL_STRING)
  925. self.assertInLog("Passing a string to do_throw")
  926. self.assertNotInLog(TEST_PASS_STRING)
  927. def testDoThrowForeignObject(self):
  928. """
  929. Check that do_throw produces reasonable messages when the
  930. input is a generic object with 'filename', 'message' and 'stack' attributes
  931. but 'object instanceof Error' returns false
  932. """
  933. self.writeFile("test_error.js", ADD_TEST_THROW_OBJECT)
  934. self.writeManifest(["test_error.js"])
  935. self.assertTestResult(False)
  936. self.assertInLog(TEST_FAIL_STRING)
  937. self.assertInLog("failure.js")
  938. self.assertInLog("Error object")
  939. self.assertInLog("ERROR STACK")
  940. self.assertNotInLog(TEST_PASS_STRING)
  941. def testDoReportForeignObject(self):
  942. """
  943. Check that do_report_unexpected_exception produces reasonable messages when the
  944. input is a generic object with 'filename', 'message' and 'stack' attributes
  945. but 'object instanceof Error' returns false
  946. """
  947. self.writeFile("test_error.js", ADD_TEST_REPORT_OBJECT)
  948. self.writeManifest(["test_error.js"])
  949. self.assertTestResult(False)
  950. self.assertInLog(TEST_FAIL_STRING)
  951. self.assertInLog("failure.js")
  952. self.assertInLog("Error object")
  953. self.assertInLog("ERROR STACK")
  954. self.assertNotInLog(TEST_PASS_STRING)
  955. def testDoReportRefError(self):
  956. """
  957. Check that do_report_unexpected_exception produces reasonable messages when the
  958. input is a JS-generated Error
  959. """
  960. self.writeFile("test_error.js", ADD_TEST_REPORT_REF_ERROR)
  961. self.writeManifest(["test_error.js"])
  962. self.assertTestResult(False)
  963. self.assertInLog(TEST_FAIL_STRING)
  964. self.assertInLog("test_error.js")
  965. self.assertInLog("obj.noSuchFunction is not a function")
  966. self.assertInLog("run_test@")
  967. self.assertNotInLog(TEST_PASS_STRING)
  968. def testDoReportSyntaxError(self):
  969. """
  970. Check that attempting to load a test file containing a syntax error
  971. generates details of the error in the log
  972. """
  973. self.writeFile("test_error.js", LOAD_ERROR_SYNTAX_ERROR)
  974. self.writeManifest(["test_error.js"])
  975. self.assertTestResult(False)
  976. self.assertInLog(TEST_FAIL_STRING)
  977. self.assertInLog("test_error.js:3")
  978. self.assertNotInLog(TEST_PASS_STRING)
  979. def testDoReportNonSyntaxError(self):
  980. """
  981. Check that attempting to load a test file containing an error other
  982. than a syntax error generates details of the error in the log
  983. """
  984. self.writeFile("test_error.js", LOAD_ERROR_OTHER_ERROR)
  985. self.writeManifest(["test_error.js"])
  986. self.assertTestResult(False)
  987. self.assertInLog(TEST_FAIL_STRING)
  988. self.assertInLog("TypeError: generator function can't return a value at")
  989. self.assertInLog("test_error.js:4")
  990. self.assertNotInLog(TEST_PASS_STRING)
  991. def testDoPrintWhenVerboseNotExplicit(self):
  992. """
  993. Check that do_print() and similar calls that generate output do
  994. not have the output when not run verbosely.
  995. """
  996. self.writeFile("test_verbose.js", ADD_TEST_VERBOSE)
  997. self.writeManifest(["test_verbose.js"])
  998. self.assertTestResult(True)
  999. self.assertNotInLog("a message from do_print")
  1000. def testDoPrintWhenVerboseExplicit(self):
  1001. """
  1002. Check that do_print() and similar calls that generate output have the
  1003. output shown when run verbosely.
  1004. """
  1005. self.writeFile("test_verbose.js", ADD_TEST_VERBOSE)
  1006. self.writeManifest(["test_verbose.js"])
  1007. self.assertTestResult(True, verbose=True)
  1008. self.assertInLog("a message from do_print")
  1009. def testDoPrintWhenVerboseInManifest(self):
  1010. """
  1011. Check that do_print() and similar calls that generate output have the
  1012. output shown when 'verbose = true' is in the manifest, even when
  1013. not run verbosely.
  1014. """
  1015. self.writeFile("test_verbose.js", ADD_TEST_VERBOSE)
  1016. self.writeManifest([("test_verbose.js", "verbose = true")])
  1017. self.assertTestResult(True)
  1018. self.assertInLog("a message from do_print")
  1019. def testAsyncCleanup(self):
  1020. """
  1021. Check that do_register_cleanup handles nicely cleanup tasks that
  1022. return a promise
  1023. """
  1024. self.writeFile("test_asyncCleanup.js", ASYNC_CLEANUP)
  1025. self.writeManifest(["test_asyncCleanup.js"])
  1026. self.assertTestResult(False)
  1027. self.assertInLog("\"1234\" == \"1234\"")
  1028. self.assertInLog("At this stage, the test has succeeded")
  1029. self.assertInLog("Throwing an error to force displaying the log")
  1030. def testNoRunTestAddTest(self):
  1031. """
  1032. Check that add_test() works fine without run_test() in the test file.
  1033. """
  1034. self.writeFile("test_noRunTestAddTest.js", NO_RUN_TEST_ADD_TEST)
  1035. self.writeManifest(["test_noRunTestAddTest.js"])
  1036. self.assertTestResult(True)
  1037. self.assertEquals(1, self.x.testCount)
  1038. self.assertEquals(1, self.x.passCount)
  1039. self.assertEquals(0, self.x.failCount)
  1040. self.assertInLog(TEST_PASS_STRING)
  1041. self.assertNotInLog(TEST_FAIL_STRING)
  1042. def testNoRunTestAddTask(self):
  1043. """
  1044. Check that add_task() works fine without run_test() in the test file.
  1045. """
  1046. self.writeFile("test_noRunTestAddTask.js", NO_RUN_TEST_ADD_TASK)
  1047. self.writeManifest(["test_noRunTestAddTask.js"])
  1048. self.assertTestResult(True)
  1049. self.assertEquals(1, self.x.testCount)
  1050. self.assertEquals(1, self.x.passCount)
  1051. self.assertEquals(0, self.x.failCount)
  1052. self.assertInLog(TEST_PASS_STRING)
  1053. self.assertNotInLog(TEST_FAIL_STRING)
  1054. def testNoRunTestAddTestAddTask(self):
  1055. """
  1056. Check that both add_test() and add_task() work without run_test()
  1057. in the test file.
  1058. """
  1059. self.writeFile("test_noRunTestAddTestAddTask.js", NO_RUN_TEST_ADD_TEST_ADD_TASK)
  1060. self.writeManifest(["test_noRunTestAddTestAddTask.js"])
  1061. self.assertTestResult(True)
  1062. self.assertEquals(1, self.x.testCount)
  1063. self.assertEquals(1, self.x.passCount)
  1064. self.assertEquals(0, self.x.failCount)
  1065. self.assertInLog(TEST_PASS_STRING)
  1066. self.assertNotInLog(TEST_FAIL_STRING)
  1067. def testNoRunTestEmptyTest(self):
  1068. """
  1069. Check that the test passes on an empty file that contains neither
  1070. run_test() nor add_test(), add_task().
  1071. """
  1072. self.writeFile("test_noRunTestEmptyTest.js", NO_RUN_TEST_EMPTY_TEST)
  1073. self.writeManifest(["test_noRunTestEmptyTest.js"])
  1074. self.assertTestResult(True)
  1075. self.assertEquals(1, self.x.testCount)
  1076. self.assertEquals(1, self.x.passCount)
  1077. self.assertEquals(0, self.x.failCount)
  1078. self.assertInLog(TEST_PASS_STRING)
  1079. self.assertNotInLog(TEST_FAIL_STRING)
  1080. def testNoRunTestAddTestFail(self):
  1081. """
  1082. Check that test fails on using add_test() without run_test().
  1083. """
  1084. self.writeFile("test_noRunTestAddTestFail.js", NO_RUN_TEST_ADD_TEST_FAIL)
  1085. self.writeManifest(["test_noRunTestAddTestFail.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)
  1090. self.assertInLog(TEST_FAIL_STRING)
  1091. self.assertNotInLog(TEST_PASS_STRING)
  1092. def testNoRunTestAddTaskFail(self):
  1093. """
  1094. Check that test fails on using add_task() without run_test().
  1095. """
  1096. self.writeFile("test_noRunTestAddTaskFail.js", NO_RUN_TEST_ADD_TASK_FAIL)
  1097. self.writeManifest(["test_noRunTestAddTaskFail.js"])
  1098. self.assertTestResult(False)
  1099. self.assertEquals(1, self.x.testCount)
  1100. self.assertEquals(0, self.x.passCount)
  1101. self.assertEquals(1, self.x.failCount)
  1102. self.assertInLog(TEST_FAIL_STRING)
  1103. self.assertNotInLog(TEST_PASS_STRING)
  1104. def testNoRunTestAddTaskMultiple(self):
  1105. """
  1106. Check that multple add_task() tests work without run_test().
  1107. """
  1108. self.writeFile("test_noRunTestAddTaskMultiple.js", NO_RUN_TEST_ADD_TASK_MULTIPLE)
  1109. self.writeManifest(["test_noRunTestAddTaskMultiple.js"])
  1110. self.assertTestResult(True)
  1111. self.assertEquals(1, self.x.testCount)
  1112. self.assertEquals(1, self.x.passCount)
  1113. self.assertEquals(0, self.x.failCount)
  1114. self.assertInLog(TEST_PASS_STRING)
  1115. self.assertNotInLog(TEST_FAIL_STRING)
  1116. def testMozinfo(self):
  1117. """
  1118. Check that mozinfo.json is loaded
  1119. """
  1120. self.writeFile("test_mozinfo.js", LOAD_MOZINFO)
  1121. self.writeManifest(["test_mozinfo.js"])
  1122. self.assertTestResult(True)
  1123. self.assertEquals(1, self.x.testCount)
  1124. self.assertEquals(1, self.x.passCount)
  1125. self.assertEquals(0, self.x.failCount)
  1126. self.assertEquals(0, self.x.todoCount)
  1127. self.assertInLog(TEST_PASS_STRING)
  1128. self.assertNotInLog(TEST_FAIL_STRING)
  1129. def testChildMozinfo(self):
  1130. """
  1131. Check that mozinfo.json is loaded in child process
  1132. """
  1133. self.writeFile("test_mozinfo.js", LOAD_MOZINFO)
  1134. self.writeFile("test_child_mozinfo.js", CHILD_MOZINFO)
  1135. self.writeManifest(["test_child_mozinfo.js"])
  1136. self.assertTestResult(True)
  1137. self.assertEquals(1, self.x.testCount)
  1138. self.assertEquals(1, self.x.passCount)
  1139. self.assertEquals(0, self.x.failCount)
  1140. self.assertEquals(0, self.x.todoCount)
  1141. self.assertInLog(TEST_PASS_STRING)
  1142. self.assertNotInLog(TEST_FAIL_STRING)
  1143. if __name__ == "__main__":
  1144. mozunit.main()