blob: f0d387e23bdc2cfb907eebd87154026ffd3fd819 [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
from __future__ import unicode_literals
import os
import shutil
import tempfile
import unittest
import mozpack.path as mozpath
from mozfile import NamedTemporaryFile
from mozunit import main
from mozbuild.base import MozbuildObject
from mozbuild.testing import (
TestMetadata,
TestResolver,
)
ALL_TESTS_JSON = b'''
{
"accessible/tests/mochitest/actions/test_anchors.html": [
{
"dir_relpath": "accessible/tests/mochitest/actions",
"expected": "pass",
"file_relpath": "accessible/tests/mochitest/actions/test_anchors.html",
"flavor": "a11y",
"here": "/Users/gps/src/firefox/accessible/tests/mochitest/actions",
"manifest": "/Users/gps/src/firefox/accessible/tests/mochitest/actions/a11y.ini",
"name": "test_anchors.html",
"path": "/Users/gps/src/firefox/accessible/tests/mochitest/actions/test_anchors.html",
"relpath": "test_anchors.html"
}
],
"services/common/tests/unit/test_async_chain.js": [
{
"dir_relpath": "services/common/tests/unit",
"file_relpath": "services/common/tests/unit/test_async_chain.js",
"firefox-appdir": "browser",
"flavor": "xpcshell",
"head": "head_global.js head_helpers.js head_http.js",
"here": "/Users/gps/src/firefox/services/common/tests/unit",
"manifest": "/Users/gps/src/firefox/services/common/tests/unit/xpcshell.ini",
"name": "test_async_chain.js",
"path": "/Users/gps/src/firefox/services/common/tests/unit/test_async_chain.js",
"relpath": "test_async_chain.js",
"tail": ""
}
],
"services/common/tests/unit/test_async_querySpinningly.js": [
{
"dir_relpath": "services/common/tests/unit",
"file_relpath": "services/common/tests/unit/test_async_querySpinningly.js",
"firefox-appdir": "browser",
"flavor": "xpcshell",
"head": "head_global.js head_helpers.js head_http.js",
"here": "/Users/gps/src/firefox/services/common/tests/unit",
"manifest": "/Users/gps/src/firefox/services/common/tests/unit/xpcshell.ini",
"name": "test_async_querySpinningly.js",
"path": "/Users/gps/src/firefox/services/common/tests/unit/test_async_querySpinningly.js",
"relpath": "test_async_querySpinningly.js",
"tail": ""
}
],
"toolkit/mozapps/update/test/unit/test_0201_app_launch_apply_update.js": [
{
"dir_relpath": "toolkit/mozapps/update/test/unit",
"file_relpath": "toolkit/mozapps/update/test/unit/test_0201_app_launch_apply_update.js",
"flavor": "xpcshell",
"generated-files": "head_update.js",
"head": "head_update.js",
"here": "/Users/gps/src/firefox/toolkit/mozapps/update/test/unit",
"manifest": "/Users/gps/src/firefox/toolkit/mozapps/update/test/unit/xpcshell_updater.ini",
"name": "test_0201_app_launch_apply_update.js",
"path": "/Users/gps/src/firefox/toolkit/mozapps/update/test/unit/test_0201_app_launch_apply_update.js",
"reason": "bug 820380",
"relpath": "test_0201_app_launch_apply_update.js",
"run-sequentially": "Launches application.",
"skip-if": "toolkit == 'gonk' || os == 'android'",
"support-files": "\\ndata/**\\nxpcshell_updater.ini",
"tail": ""
},
{
"dir_relpath": "toolkit/mozapps/update/test/unit",
"file_relpath": "toolkit/mozapps/update/test/unit/test_0201_app_launch_apply_update.js",
"flavor": "xpcshell",
"generated-files": "head_update.js",
"head": "head_update.js head2.js",
"here": "/Users/gps/src/firefox/toolkit/mozapps/update/test/unit",
"manifest": "/Users/gps/src/firefox/toolkit/mozapps/update/test/unit/xpcshell_updater.ini",
"name": "test_0201_app_launch_apply_update.js",
"path": "/Users/gps/src/firefox/toolkit/mozapps/update/test/unit/test_0201_app_launch_apply_update.js",
"reason": "bug 820380",
"relpath": "test_0201_app_launch_apply_update.js",
"run-sequentially": "Launches application.",
"skip-if": "toolkit == 'gonk' || os == 'android'",
"support-files": "\\ndata/**\\nxpcshell_updater.ini",
"tail": ""
}
],
"mobile/android/tests/background/junit3/src/common/TestAndroidLogWriters.java": [
{
"dir_relpath": "mobile/android/tests/background/junit3/src/common",
"file_relpath": "mobile/android/tests/background/junit3/src/common/TestAndroidLogWriters.java",
"flavor": "instrumentation",
"here": "/Users/nalexander/Mozilla/gecko-dev/mobile/android/tests/background/junit3",
"manifest": "/Users/nalexander/Mozilla/gecko-dev/mobile/android/tests/background/junit3/instrumentation.ini",
"name": "src/common/TestAndroidLogWriters.java",
"path": "/Users/nalexander/Mozilla/gecko-dev/mobile/android/tests/background/junit3/src/common/TestAndroidLogWriters.java",
"relpath": "src/common/TestAndroidLogWriters.java",
"subsuite": "background"
}
],
"mobile/android/tests/browser/junit3/src/TestDistribution.java": [
{
"dir_relpath": "mobile/android/tests/browser/junit3/src",
"file_relpath": "mobile/android/tests/browser/junit3/src/TestDistribution.java",
"flavor": "instrumentation",
"here": "/Users/nalexander/Mozilla/gecko-dev/mobile/android/tests/browser/junit3",
"manifest": "/Users/nalexander/Mozilla/gecko-dev/mobile/android/tests/browser/junit3/instrumentation.ini",
"name": "src/TestDistribution.java",
"path": "/Users/nalexander/Mozilla/gecko-dev/mobile/android/tests/browser/junit3/src/TestDistribution.java",
"relpath": "src/TestDistribution.java",
"subsuite": "browser"
}
],
"image/test/browser/browser_bug666317.js": [
{
"dir_relpath": "image/test/browser",
"file_relpath": "image/test/browser/browser_bug666317.js",
"flavor": "browser-chrome",
"here": "/home/chris/m-c/obj-dbg/_tests/testing/mochitest/browser/image/test/browser",
"manifest": "/home/chris/m-c/image/test/browser/browser.ini",
"name": "browser_bug666317.js",
"path": "/home/chris/m-c/obj-dbg/_tests/testing/mochitest/browser/image/test/browser/browser_bug666317.js",
"relpath": "image/test/browser/browser_bug666317.js",
"skip-if": "e10s # Bug 948194 - Decoded Images seem to not be discarded on memory-pressure notification with e10s enabled",
"subsuite": ""
}
],
"devtools/client/markupview/test/browser_markupview_copy_image_data.js": [
{
"dir_relpath": "devtools/client/markupview/test",
"file_relpath": "devtools/client/markupview/test/browser_markupview_copy_image_data.js",
"flavor": "browser-chrome",
"here": "/home/chris/m-c/obj-dbg/_tests/testing/mochitest/browser/devtools/client/markupview/test",
"manifest": "/home/chris/m-c/devtools/client/markupview/test/browser.ini",
"name": "browser_markupview_copy_image_data.js",
"path": "/home/chris/m-c/obj-dbg/_tests/testing/mochitest/browser/devtools/client/markupview/test/browser_markupview_copy_image_data.js",
"relpath": "devtools/client/markupview/test/browser_markupview_copy_image_data.js",
"subsuite": "devtools",
"tags": "devtools"
}
]
}'''.strip()
class Base(unittest.TestCase):
def setUp(self):
self._temp_files = []
def tearDown(self):
for f in self._temp_files:
del f
self._temp_files = []
def _get_test_metadata(self):
f = NamedTemporaryFile()
f.write(ALL_TESTS_JSON)
f.flush()
self._temp_files.append(f)
return TestMetadata(filename=f.name)
class TestTestMetadata(Base):
def test_load(self):
t = self._get_test_metadata()
self.assertEqual(len(t._tests_by_path), 8)
self.assertEqual(len(list(t.tests_with_flavor('xpcshell'))), 3)
self.assertEqual(len(list(t.tests_with_flavor('mochitest-plain'))), 0)
def test_resolve_all(self):
t = self._get_test_metadata()
self.assertEqual(len(list(t.resolve_tests())), 9)
def test_resolve_filter_flavor(self):
t = self._get_test_metadata()
self.assertEqual(len(list(t.resolve_tests(flavor='xpcshell'))), 4)
def test_resolve_by_dir(self):
t = self._get_test_metadata()
self.assertEqual(len(list(t.resolve_tests(paths=['services/common']))), 2)
def test_resolve_under_path(self):
t = self._get_test_metadata()
self.assertEqual(len(list(t.resolve_tests(under_path='services'))), 2)
self.assertEqual(len(list(t.resolve_tests(flavor='xpcshell',
under_path='services'))), 2)
def test_resolve_multiple_paths(self):
t = self._get_test_metadata()
result = list(t.resolve_tests(paths=['services', 'toolkit']))
self.assertEqual(len(result), 4)
def test_resolve_path_prefix(self):
t = self._get_test_metadata()
result = list(t.resolve_tests(paths=['image']))
self.assertEqual(len(result), 1)
class TestTestResolver(Base):
FAKE_TOPSRCDIR = '/Users/gps/src/firefox'
def setUp(self):
Base.setUp(self)
self._temp_dirs = []
def tearDown(self):
Base.tearDown(self)
for d in self._temp_dirs:
shutil.rmtree(d)
def _get_resolver(self):
topobjdir = tempfile.mkdtemp()
self._temp_dirs.append(topobjdir)
with open(os.path.join(topobjdir, 'all-tests.json'), 'wt') as fh:
fh.write(ALL_TESTS_JSON)
o = MozbuildObject(self.FAKE_TOPSRCDIR, None, None, topobjdir=topobjdir)
return o._spawn(TestResolver)
def test_cwd_children_only(self):
"""If cwd is defined, only resolve tests under the specified cwd."""
r = self._get_resolver()
# Pretend we're under '/services' and ask for 'common'. This should
# pick up all tests from '/services/common'
tests = list(r.resolve_tests(paths=['common'], cwd=os.path.join(r.topsrcdir,
'services')))
self.assertEqual(len(tests), 2)
# Tests should be rewritten to objdir.
for t in tests:
self.assertEqual(t['here'], mozpath.join(r.topobjdir,
'_tests/xpcshell/services/common/tests/unit'))
def test_various_cwd(self):
"""Test various cwd conditions are all equal."""
r = self._get_resolver()
expected = list(r.resolve_tests(paths=['services']))
actual = list(r.resolve_tests(paths=['services'], cwd='/'))
self.assertEqual(actual, expected)
actual = list(r.resolve_tests(paths=['services'], cwd=r.topsrcdir))
self.assertEqual(actual, expected)
actual = list(r.resolve_tests(paths=['services'], cwd=r.topobjdir))
self.assertEqual(actual, expected)
def test_subsuites(self):
"""Test filtering by subsuite."""
r = self._get_resolver()
tests = list(r.resolve_tests(paths=['mobile']))
self.assertEqual(len(tests), 2)
tests = list(r.resolve_tests(paths=['mobile'], subsuite='browser'))
self.assertEqual(len(tests), 1)
self.assertEqual(tests[0]['name'], 'src/TestDistribution.java')
tests = list(r.resolve_tests(paths=['mobile'], subsuite='background'))
self.assertEqual(len(tests), 1)
self.assertEqual(tests[0]['name'], 'src/common/TestAndroidLogWriters.java')
def test_wildcard_patterns(self):
"""Test matching paths by wildcard."""
r = self._get_resolver()
tests = list(r.resolve_tests(paths=['mobile/**']))
self.assertEqual(len(tests), 2)
for t in tests:
self.assertTrue(t['file_relpath'].startswith('mobile'))
tests = list(r.resolve_tests(paths=['**/**.js', 'accessible/**']))
self.assertEqual(len(tests), 7)
for t in tests:
path = t['file_relpath']
self.assertTrue(path.startswith('accessible') or path.endswith('.js'))
if __name__ == '__main__':
main()