# -*- coding: utf-8 -*-
import json
import time
import mozunit
import pytest
# flake8: noqa
@pytest.mark.parametrize(
"logs,expected" ,
(
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "OK" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_end" , "test_baz" , "PASS" , "FAIL" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"test" : "test_baz" , "subtest" : null, "group" : "manifestA" , "status" : "PASS" , "expected" : "FAIL" , "message" : null, "stack" : null, "modifiers" : "" , "known_intermittent" : [], "action" : "test_result" , "line" : 8}
{"group" : "manifestA" , "status" : "ERROR" , "duration" : 20, "action" : "group_result" , "line" : 9}
{"group" : "manifestB" , "status" : "OK" , "duration" : 10, "action" : "group_result" , "line" : 9}
"" ".strip(),
id="basic" ,
),
pytest.param(
[
("suite_start" , {"manifest" : ["test_foo" ]}),
("test_start" , "test_foo" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifest" ], "action" : "test_groups" , "line" : 0}
{"group" : "manifest" , "status" : null, "duration" : 0, "action" : "group_result" , "line" : 2}
"" ".strip(),
id="missing_test_end" ,
),
pytest.param(
[
("suite_start" , {"manifest" : ["test_foo" ]}),
("test_start" , "test_foo" ),
("test_status" , "test_foo" , "subtest" , "PASS" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifest" ], "action" : "test_groups" , "line" : 0}
{"group" : "manifest" , "status" : "ERROR" , "duration" : null, "action" : "group_result" , "line" : 3}
"" ".strip(),
id="missing_test_end_with_test_status_ok" ,
marks=pytest.mark.xfail, # status is OK but should be ERROR
),
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "CRASH" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_end" , "test_baz" , "FAIL" , "FAIL" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"test" : "test_bar" , "subtest" : null, "group" : "manifestA" , "status" : "CRASH" , "expected" : "OK" , "message" : null, "stack" : null, "modifiers" : "" , "known_intermittent" : [], "action" : "test_result" , "line" : 4}
{"group" : "manifestA" , "status" : "ERROR" , "duration" : 20, "action" : "group_result" , "line" : 9}
{"group" : "manifestB" , "status" : "OK" , "duration" : 10, "action" : "group_result" , "line" : 9}
"" ".strip(),
id="crash_and_group_status" ,
),
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "OK" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_status" , "test_baz" , "subtest" , "FAIL" , "FAIL" ),
("test_end" , "test_baz" , "OK" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"group" : "manifestA" , "status" : "OK" , "duration" : 29, "action" : "group_result" , "line" : 10}
{"group" : "manifestB" , "status" : "OK" , "duration" : 10, "action" : "group_result" , "line" : 10}
"" ".strip(),
id="fail_expected_fail" ,
),
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "OK" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_status" , "test_baz" , "Test timed out" , "FAIL" , "PASS" ),
("test_status" , "test_baz" , "" , "TIMEOUT" , "PASS" ),
("crash" , "" , "signature" , "manifestA" ),
("test_end" , "test_baz" , "OK" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"test" : "test_baz" , "subtest" : "Test timed out" , "group" : "manifestA" , "status" : "FAIL" , "expected" : "PASS" , "message" : null, "stack" : null, "modifiers" : "" , "known_intermittent" : [], "action" : "test_result" , "line" : 8}
{"test" : "test_baz" , "subtest" : "" , "group" : "manifestA" , "status" : "TIMEOUT" , "expected" : "PASS" , "message" : null, "stack" : null, "modifiers" : "" , "known_intermittent" : [], "action" : "test_result" , "line" : 9}
{"test" : "manifestA" , "group" : "manifestA" , "signature" : "signature" , "stackwalk_stderr" : null, "stackwalk_stdout" : null, "action" : "crash" , "line" : 10}
{"group" : "manifestA" , "status" : "ERROR" , "duration" : 49, "action" : "group_result" , "line" : 12}
{"group" : "manifestB" , "status" : "OK" , "duration" : 10, "action" : "group_result" , "line" : 12}
"" ".strip(),
id="timeout_and_crash" ,
),
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "CRASH" , "CRASH" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_end" , "test_baz" , "FAIL" , "FAIL" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"group" : "manifestA" , "status" : "OK" , "duration" : 20, "action" : "group_result" , "line" : 9}
{"group" : "manifestB" , "status" : "OK" , "duration" : 10, "action" : "group_result" , "line" : 9}
"" ".strip(),
id="crash_expected_crash" ,
),
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "OK" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_end" , "test_baz" , "FAIL" , "FAIL" ),
("crash" , "" , "" , "manifestA" ),
("suite_end" ,),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"test" : "manifestA" , "group" : "manifestA" , "signature" : "" , "stackwalk_stderr" : null, "stackwalk_stdout" : null, "action" : "crash" , "line" : 9}
{"group" : "manifestA" , "status" : "ERROR" , "duration" : 20, "action" : "group_result" , "line" : 10}
{"group" : "manifestB" , "status" : "OK" , "duration" : 10, "action" : "group_result" , "line" : 10}
"" ".strip(),
id="assertion_crash_on_shutdown" ,
),
pytest.param(
[
(
"suite_start" ,
{
"manifestA" : ["test_foo" , "test_bar" , "test_baz" ],
"manifestB" : ["test_something" ],
},
),
("test_start" , "test_foo" ),
("test_end" , "test_foo" , "SKIP" ),
("test_start" , "test_bar" ),
("test_end" , "test_bar" , "OK" ),
("test_start" , "test_something" ),
("test_end" , "test_something" , "OK" ),
("test_start" , "test_baz" ),
("test_end" , "test_baz" , "FAIL" ),
],
"" "
{"groups" : ["manifestA" , "manifestB" ], "action" : "test_groups" , "line" : 0}
{"test" : "test_baz" , "group" : "manifestA" , "status" : "FAIL" , "expected" : "OK" , "subtest" : null, "message" : null, "stack" : null, "modifiers" : "" , "known_intermittent" : [], "action" : "test_result" , "line" : 8}
"" ".strip(),
id="timeout_no_group_status" ,
),
),
)
def test_errorsummary(monkeypatch, get_logger, logs, expected):
ts = {"ts" : 0.0} # need to use dict since 'nonlocal' doesn't exist on PY2
def fake_time():
ts["ts" ] += 0.01
return ts["ts" ]
monkeypatch.setattr(time, "time" , fake_time)
logger = get_logger("errorsummary" )
for log in logs:
getattr(logger, log[0])(*log[1:])
buf = logger.handlers[0].stream
result = buf.getvalue()
print("Dumping result for copy/paste:" )
print(result)
expected = expected.split("\n" )
for i, line in enumerate(result.split("\n" )):
if not line:
continue
data = json.loads(line)
assert data == json.loads(expected[i])
if __name__ == "__main__" :
mozunit.main()
Messung V0.5 C=99 H=92 G=95
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet)
¤
*© Formatika GbR, Deutschland