Source code

Revision control

Copy as Markdown

Other Tools

# 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/.
import os
from argparse import Namespace
from collections import defaultdict
from textwrap import dedent
import mozunit
import pytest
import six
from conftest import setup_args
from manifestparser import TestManifest
@pytest.fixture
def get_active_tests(setup_test_harness, parser):
setup_test_harness(*setup_args)
runtests = pytest.importorskip("runtests")
md = runtests.MochitestDesktop("plain", {"log_tbpl": "-"})
options = vars(parser.parse_args([]))
def inner(**kwargs):
opts = options.copy()
opts.update(kwargs)
manifest = opts.get("manifestFile")
if isinstance(manifest, six.string_types):
md.testRootAbs = os.path.dirname(manifest)
elif isinstance(manifest, TestManifest):
md.testRootAbs = manifest.rootdir
md._active_tests = None
md.prefs_by_manifest = defaultdict(set)
return md, md.getActiveTests(Namespace(**opts))
return inner
@pytest.fixture
def create_manifest(tmpdir, build_obj):
def inner(string, name="manifest.ini"):
manifest = tmpdir.join(name)
manifest.write(string, ensure=True)
# pylint --py3k: W1612
path = six.text_type(manifest)
return TestManifest(manifests=(path,), strict=False, rootdir=tmpdir.strpath)
return inner
def test_args_validation(get_active_tests, create_manifest):
# Test args set in a single manifest.
manifest_relpath = "manifest.ini"
manifest = create_manifest(
dedent(
"""
[DEFAULT]
args=
--cheese
--foo=bar
--foo1 bar1
[files/test_pass.html]
[files/test_fail.html]
"""
)
)
options = {
"runByManifest": True,
"manifestFile": manifest,
}
md, tests = get_active_tests(**options)
assert len(tests) == 2
assert manifest_relpath in md.args_by_manifest
args = md.args_by_manifest[manifest_relpath]
assert len(args) == 1
assert args.pop() == "\n--cheese\n--foo=bar\n--foo1 bar1"
# Test args set with runByManifest disabled.
options["runByManifest"] = False
with pytest.raises(SystemExit):
get_active_tests(**options)
# Test args set in non-default section.
options["runByManifest"] = True
options["manifestFile"] = create_manifest(
dedent(
"""
[files/test_pass.html]
args=--foo2=bar2
[files/test_fail.html]
"""
)
)
with pytest.raises(SystemExit):
get_active_tests(**options)
def test_args_validation_with_ancestor_manifest(get_active_tests, create_manifest):
# Test args set by an ancestor manifest.
create_manifest(
dedent(
"""
[DEFAULT]
args=
--cheese
[files/test_pass.html]
[files/test_fail.html]
"""
),
name="subdir/manifest.ini",
)
manifest = create_manifest(
dedent(
"""
[DEFAULT]
args =
--foo=bar
[include:manifest.ini]
[test_foo.html]
"""
),
name="subdir/ancestor-manifest.ini",
)
options = {
"runByManifest": True,
"manifestFile": manifest,
}
md, tests = get_active_tests(**options)
assert len(tests) == 3
key = os.path.join("subdir", "ancestor-manifest.ini")
assert key in md.args_by_manifest
args = md.args_by_manifest[key]
assert len(args) == 1
assert args.pop() == "\n--foo=bar"
key = "{}:{}".format(
os.path.join("subdir", "ancestor-manifest.ini"),
os.path.join("subdir", "manifest.ini"),
)
assert key in md.args_by_manifest
args = md.args_by_manifest[key]
assert len(args) == 1
assert args.pop() == "\n--foo=bar \n--cheese"
def test_prefs_validation(get_active_tests, create_manifest):
# Test prefs set in a single manifest.
manifest_relpath = "manifest.ini"
manifest = create_manifest(
dedent(
"""
[DEFAULT]
prefs=
foo=bar
browser.dom.foo=baz
[files/test_pass.html]
[files/test_fail.html]
"""
)
)
options = {
"runByManifest": True,
"manifestFile": manifest,
}
md, tests = get_active_tests(**options)
assert len(tests) == 2
assert manifest_relpath in md.prefs_by_manifest
prefs = md.prefs_by_manifest[manifest_relpath]
assert len(prefs) == 1
assert prefs.pop() == "\nfoo=bar\nbrowser.dom.foo=baz"
# Test prefs set with runByManifest disabled.
options["runByManifest"] = False
with pytest.raises(SystemExit):
get_active_tests(**options)
# Test prefs set in non-default section.
options["runByManifest"] = True
options["manifestFile"] = create_manifest(
dedent(
"""
[files/test_pass.html]
prefs=foo=bar
[files/test_fail.html]
"""
)
)
with pytest.raises(SystemExit):
get_active_tests(**options)
def test_prefs_validation_with_ancestor_manifest(get_active_tests, create_manifest):
# Test prefs set by an ancestor manifest.
create_manifest(
dedent(
"""
[DEFAULT]
prefs=
foo=bar
browser.dom.foo=baz
[files/test_pass.html]
[files/test_fail.html]
"""
),
name="subdir/manifest.ini",
)
manifest = create_manifest(
dedent(
"""
[DEFAULT]
prefs =
browser.dom.foo=fleem
flower=rose
[include:manifest.ini]
[test_foo.html]
"""
),
name="subdir/ancestor-manifest.ini",
)
options = {
"runByManifest": True,
"manifestFile": manifest,
}
md, tests = get_active_tests(**options)
assert len(tests) == 3
key = os.path.join("subdir", "ancestor-manifest.ini")
assert key in md.prefs_by_manifest
prefs = md.prefs_by_manifest[key]
assert len(prefs) == 1
assert prefs.pop() == "\nbrowser.dom.foo=fleem\nflower=rose"
key = "{}:{}".format(
os.path.join("subdir", "ancestor-manifest.ini"),
os.path.join("subdir", "manifest.ini"),
)
assert key in md.prefs_by_manifest
prefs = md.prefs_by_manifest[key]
assert len(prefs) == 1
assert (
prefs.pop()
== "\nbrowser.dom.foo=fleem\nflower=rose \nfoo=bar\nbrowser.dom.foo=baz"
)
if __name__ == "__main__":
mozunit.main()