diff --git a/testing/mochitest/runtests.py b/testing/mochitest/runtests.py index 43f87506954d..0d06a8a64c70 100644 --- a/testing/mochitest/runtests.py +++ b/testing/mochitest/runtests.py @@ -144,11 +144,12 @@ class MessageLogger(object): "buffering_off", ] ) + # Regexes that will be replaced with an empty string if found in a test + # name. We do this to normalize test names which may contain URLs and test + # package prefixes. TEST_PATH_PREFIXES = [ - "/tests/", - "chrome://mochitests/content/a11y/", - "chrome://mochitests/content/browser/", - "chrome://mochitests/content/chrome/", + r"^/tests/", + r"^\w+://[\w\.]+(:\d+)?(/\w+)?/(tests?|a11y|chrome|browser)/", ] def __init__(self, logger, buffering=True, structured=True): @@ -190,9 +191,10 @@ class MessageLogger(object): """Normalize a logged test path to match the relative path from the sourcedir.""" if message.get("test") is not None: test = message["test"] - for prefix in MessageLogger.TEST_PATH_PREFIXES: - if test.startswith(prefix): - message["test"] = test[len(prefix) :] + for pattern in MessageLogger.TEST_PATH_PREFIXES: + test = re.sub(pattern, "", test) + if test != message["test"]: + message["test"] = test break def _fix_message_format(self, message): diff --git a/testing/mochitest/tests/python/test_message_logger.py b/testing/mochitest/tests/python/test_message_logger.py index 65b2c9618447..2654089d2778 100644 --- a/testing/mochitest/tests/python/test_message_logger.py +++ b/testing/mochitest/tests/python/test_message_logger.py @@ -53,7 +53,7 @@ def get_message_logger(setup_test_harness, logger): message["message"] = "foobar" message.update(**extra) - return self.process_message(message) + return self.write(json.dumps(message)) def inner(**kwargs): ml = runtests.MessageLogger(logger, **kwargs) @@ -66,22 +66,31 @@ def get_message_logger(setup_test_harness, logger): @pytest.fixture -def assert_actions(logger): +def get_lines(logger): buf = logger.handlers[0].stream - def inner(expected): - if isinstance(expected, string_types): - expected = [expected] - + def inner(): lines = buf.getvalue().splitlines() - actions = [json.loads(l)["action"] for l in lines] - assert actions == expected buf.truncate(0) # Python3 will not reposition the buffer position after # truncate and will extend the buffer with null bytes. # Force the buffer position to the start of the buffer # to prevent null bytes from creeping in. buf.seek(0) + return lines + + return inner + + +@pytest.fixture +def assert_actions(get_lines): + def inner(expected): + if isinstance(expected, string_types): + expected = [expected] + + lines = get_lines() + actions = [json.loads(l)["action"] for l in lines] + assert actions == expected return inner @@ -155,5 +164,30 @@ def test_buffering_off(get_message_logger, assert_actions): assert_actions(["test_end"]) +@pytest.mark.parametrize( + "name,expected", + ( + ("/tests/test_foo.html", "test_foo.html"), + ("chrome://mochitests/content/a11y/test_foo.html", "test_foo.html"), + ("chrome://mochitests/content/browser/test_foo.html", "test_foo.html"), + ("chrome://mochitests/content/chrome/test_foo.html", "test_foo.html"), + ( + "https://example.org:443/tests/netwerk/test_foo.html", + "netwerk/test_foo.html", + ), + ("http://mochi.test:8888/tests/test_foo.html", "test_foo.html"), + ("http://mochi.test:8888/content/dom/browser/test_foo.html", None), + ), +) +def test_test_names_fixed_to_be_relative(name, expected, get_message_logger, get_lines): + ml = get_message_logger(buffering=False) + ml.fake_message("test_start", test=name) + lines = get_lines() + + if expected is None: + expected = name + assert json.loads(lines[0])["test"] == expected + + if __name__ == "__main__": mozunit.main()