Source code

Revision control

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
from __future__ import absolute_import
import sys
import mozunit
import pytest
PY2 = sys.version_info.major == 2
if PY2:
from mock import Mock, patch, sentinel
from unittest.mock import Mock, patch, sentinel
import marionette_harness.marionette_test as marionette_test
from marionette_harness.runtests import MarionetteTestRunner, MarionetteHarness, cli
def harness_class(request):
Mock based on MarionetteHarness whose run method just returns a number of
failures according to the supplied test parameter
if "num_fails_crashed" in request.funcargnames:
num_fails_crashed = request.getfuncargvalue("num_fails_crashed")
num_fails_crashed = (0, 0)
harness_cls = Mock(spec=MarionetteHarness)
harness = harness_cls.return_value
if num_fails_crashed is None: = Exception
else: = sum(num_fails_crashed)
return harness_cls
def runner_class(request):
Mock based on MarionetteTestRunner, wherein the runner.failed,
runner.crashed attributes are provided by a test parameter
if "num_fails_crashed" in request.funcargnames:
failures, crashed = request.getfuncargvalue("num_fails_crashed")
failures = 0
crashed = 0
mock_runner_class = Mock(spec=MarionetteTestRunner)
runner = mock_runner_class.return_value
runner.failed = failures
runner.crashed = crashed
return mock_runner_class
[((0, 0), 0), ((1, 0), 10), ((0, 1), 10), (None, 1)],
def test_cli_exit_code(num_fails_crashed, exit_code, harness_class):
with pytest.raises(SystemExit) as err:
assert err.value.code == exit_code
@pytest.mark.parametrize("num_fails_crashed", [(0, 0), (1, 0), (1, 1)])
def test_call_harness_with_parsed_args_yields_num_failures(
mach_parsed_kwargs, runner_class, num_fails_crashed
with patch(
) as parse_args:
failed_or_crashed = MarionetteHarness(
runner_class, args=mach_parsed_kwargs
assert failed_or_crashed == sum(num_fails_crashed)
def test_call_harness_with_no_args_yields_num_failures(runner_class):
with patch(
return_value={"tests": []},
) as parse_args:
failed_or_crashed = MarionetteHarness(runner_class).run()
assert parse_args.call_count == 1
assert failed_or_crashed == 0
def test_args_passed_to_runner_class(mach_parsed_kwargs, runner_class):
arg_list = list(mach_parsed_kwargs.keys())
mach_parsed_kwargs.update([(a, getattr(sentinel, a)) for a in arg_list])
harness = MarionetteHarness(runner_class, args=mach_parsed_kwargs)
harness.process_args = Mock()
for arg in arg_list:
assert harness._runner_class.call_args[1][arg] is getattr(sentinel, arg)
def test_harness_sets_up_default_test_handlers(mach_parsed_kwargs):
If the necessary TestCase is not in test_handlers,
tests are omitted silently
harness = MarionetteHarness(args=mach_parsed_kwargs)
runner = harness._runner_class(**mach_parsed_kwargs)
assert marionette_test.MarionetteTestCase in runner.test_handlers
if __name__ == "__main__":
mozunit.main("-p", "no:terminalreporter", "--log-tbpl=-", "--capture", "no")