# 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
try:
# Python2
from cStringIO
import StringIO
except ImportError:
# Python3
from io
import StringIO
from functools
import partial
import mozunit
import pytest
from mozharness.base.log
import ERROR, INFO, WARNING
from mozharness.mozilla.automation
import TBPL_FAILURE, TBPL_SUCCESS, TBPL_WARNING
from moztest.selftest.output
import filter_action, get_mozharness_status
here = os.path.abspath(os.path.dirname(__file__))
get_mozharness_status = partial(get_mozharness_status,
"reftest")
def test_output_pass(runtests):
status, lines = runtests(
"reftest-pass.list")
assert status == 0
tbpl_status, log_level, summary = get_mozharness_status(lines, status)
assert tbpl_status == TBPL_SUCCESS
assert log_level
in (INFO, WARNING)
test_status = filter_action(
"test_status", lines)
assert len(test_status) == 3
assert all(t[
"status"] ==
"PASS" for t
in test_status)
test_end = filter_action(
"test_end", lines)
assert len(test_end) == 3
assert all(t[
"status"] ==
"OK" for t
in test_end)
def test_output_fail(runtests):
formatter = pytest.importorskip(
"output").ReftestFormatter()
status, lines = runtests(
"reftest-fail.list")
assert status == 0
buf = StringIO()
tbpl_status, log_level, summary = get_mozharness_status(
lines, status, formatter=formatter, buf=buf
)
assert tbpl_status == TBPL_WARNING
assert log_level == WARNING
test_status = filter_action(
"test_status", lines)
assert len(test_status) == 3
assert all(t[
"status"] ==
"FAIL" for t
in test_status)
assert all(
"reftest_screenshots" in t[
"extra"]
for t
in test_status)
test_end = filter_action(
"test_end", lines)
assert len(test_end) == 3
assert all(t[
"status"] ==
"OK" for t
in test_end)
# ensure screenshots were printed
formatted = buf.getvalue()
assert "REFTEST IMAGE 1" in formatted
assert "REFTEST IMAGE 2" in formatted
@pytest.mark.skip_mozinfo(
"!crashreporter")
def test_output_crash(runtests):
status, lines = runtests(
"reftest-crash.list", environment=[
"MOZ_CRASHREPORTER_SHUTDOWN=1"]
)
assert status == 245
tbpl_status, log_level, summary = get_mozharness_status(lines, status)
assert tbpl_status == TBPL_FAILURE
assert log_level == ERROR
crash = filter_action(
"crash", lines)
assert len(crash) == 1
assert crash[0][
"action"] ==
"crash"
assert crash[0][
"signature"]
assert crash[0][
"minidump_path"]
lines = filter_action(
"test_end", lines)
assert len(lines) == 0
@pytest.mark.skip_mozinfo(
"!asan")
def test_output_asan(runtests):
status, lines = runtests(
"reftest-crash.list", environment=[
"MOZ_CRASHREPORTER_SHUTDOWN=1"]
)
assert status == 245
tbpl_status, log_level, summary = get_mozharness_status(lines, status)
assert tbpl_status == TBPL_FAILURE
assert log_level == ERROR
crash = filter_action(
"crash", lines)
assert len(crash) == 0
process_output = filter_action(
"process_output", lines)
assert any(
"ERROR: AddressSanitizer" in l[
"data"]
for l
in process_output)
@pytest.mark.skip_mozinfo(
"!debug")
def test_output_assertion(runtests):
status, lines = runtests(
"reftest-assert.list")
assert status == 0
tbpl_status, log_level, summary = get_mozharness_status(lines, status)
assert tbpl_status == TBPL_WARNING
assert log_level == WARNING
test_status = filter_action(
"test_status", lines)
assert len(test_status) == 1
assert test_status[0][
"status"] ==
"PASS"
test_end = filter_action(
"test_end", lines)
assert len(test_end) == 1
assert test_end[0][
"status"] ==
"OK"
assertions = filter_action(
"assertion_count", lines)
assert len(assertions) == 1
assert assertions[0][
"count"] == 1
@pytest.mark.skip_mozinfo(
"!debug")
def test_output_leak(monkeypatch, runtests):
# Monkeypatch mozleak so we always process a failing leak log
# instead of the actual one.
import mozleak
old_process_leak_log = mozleak.process_leak_log
def process_leak_log(*args, **kwargs):
return old_process_leak_log(
os.path.join(here,
"files",
"leaks.log"), *args[1:], **kwargs
)
monkeypatch.setattr(
"mozleak.process_leak_log", process_leak_log)
status, lines = runtests(
"reftest-pass.list")
assert status == 0
tbpl_status, log_level, summary = get_mozharness_status(lines, status)
assert tbpl_status == TBPL_WARNING
assert log_level == WARNING
leaks = filter_action(
"mozleak_total", lines)
assert len(leaks) == 1
assert leaks[0][
"process"] ==
"default"
assert leaks[0][
"bytes"] == 19915
if __name__ ==
"__main__":
mozunit.main()