#!/usr/bin/env python3 # 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 https://mozilla.org/MPL/2.0/. import runner import pytest def test_log_parser(): mock_url = "http://localhost:8000/page_load_test/56.com/www.56.com/index.html" mock_log = b''' [PERF] perf block start [PERF],testcase,http://localhost:8000/page_load_test/56.com/www.56.com/index.html [PERF],navigationStart,1460358376 [PERF],unloadEventStart,undefined [PERF],unloadEventEnd,undefined [PERF],redirectStart,undefined [PERF],redirectEnd,undefined [PERF],fetchStart,undefined [PERF],domainLookupStart,undefined [PERF],domainLookupEnd,undefined [PERF],connectStart,undefined [PERF],connectEnd,undefined [PERF],secureConnectionStart,undefined [PERF],requestStart,undefined [PERF],responseStart,undefined [PERF],responseEnd,undefined [PERF],domLoading,1460358376000 [PERF],domInteractive,1460358388000 [PERF],domContentLoadedEventStart,1460358388000 [PERF],domContentLoadedEventEnd,1460358388000 [PERF],domComplete,1460358389000 [PERF],loadEventStart,undefined [PERF],loadEventEnd,undefined [PERF] perf block end Shutting down the Constellation after generating an output file or exit flag specified ''' expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "navigationStart": 1460358376, "unloadEventStart": None, "unloadEventEnd": None, "redirectStart": None, "redirectEnd": None, "fetchStart": None, "domainLookupStart": None, "domainLookupEnd": None, "connectStart": None, "connectEnd": None, "secureConnectionStart": None, "requestStart": None, "responseStart": None, "responseEnd": None, "domLoading": 1460358376000, "domInteractive": 1460358388000, "domContentLoadedEventStart": 1460358388000, "domContentLoadedEventEnd": 1460358388000, "domComplete": 1460358389000, "loadEventStart": None, "loadEventEnd": None }] result = runner.parse_log(mock_log, mock_url) assert (expected == list(result)) def test_log_parser_complex(): mock_log = b''' [PERF] perf block start [PERF],testcase,http://localhost:8000/page_load_test/56.com/www.56.com/content.html [PERF],navigationStart,1460358300 [PERF],unloadEventStart,undefined [PERF],unloadEventEnd,undefined [PERF],redirectStart,undefined [PERF],redirectEnd,undefined [PERF],fetchStart,undefined [PERF],domainLookupStart,undefined [PERF],domainLookupEnd,undefined [PERF],connectStart,undefined [PERF],connectEnd,undefined [PERF],secureConnectionStart,undefined [PERF],requestStart,undefined [PERF],responseStart,undefined [PERF],responseEnd,undefined [PERF],domLoading,1460358376000 [PERF],domInteractive,1460358388000 [PERF],domContentLoadedEventStart,1460358388000 [PERF],domContentLoadedEventEnd,1460358388000 [PERF],domComplete,1460358389000 [PERF],loadEventStart,undefined [PERF],loadEventEnd,undefined [PERF] perf block end Some other js error logs here [PERF] perf block start [PERF],testcase,http://localhost:8000/page_load_test/56.com/www.56.com/index.html [PERF],navigationStart,1460358376 [PERF],unloadEventStart,undefined [PERF],unloadEventEnd,undefined [PERF],redirectStart,undefined [PERF],redirectEnd,undefined [PERF],fetchStart,undefined [PERF],domainLookupStart,undefined [PERF],domainLookupEnd,undefined [PERF],connectStart,undefined [PERF],connectEnd,undefined [PERF],secureConnectionStart,undefined [PERF],requestStart,undefined [PERF],responseStart,undefined [PERF],responseEnd,undefined [PERF],domLoading,1460358376000 [PERF],domInteractive,1460358388000 [PERF],domContentLoadedEventStart,1460358388000 [PERF],domContentLoadedEventEnd,1460358388000 [PERF],domComplete,1460358389000 [PERF],loadEventStart,undefined [PERF],loadEventEnd,undefined [PERF] perf block end Shutting down the Constellation after generating an output file or exit flag specified ''' mock_url = "http://localhost:8000/page_load_test/56.com/www.56.com/index.html" expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "navigationStart": 1460358376, "unloadEventStart": None, "unloadEventEnd": None, "redirectStart": None, "redirectEnd": None, "fetchStart": None, "domainLookupStart": None, "domainLookupEnd": None, "connectStart": None, "connectEnd": None, "secureConnectionStart": None, "requestStart": None, "responseStart": None, "responseEnd": None, "domLoading": 1460358376000, "domInteractive": 1460358388000, "domContentLoadedEventStart": 1460358388000, "domContentLoadedEventEnd": 1460358388000, "domComplete": 1460358389000, "loadEventStart": None, "loadEventEnd": None }] result = runner.parse_log(mock_log, mock_url) assert (expected == list(result)) def test_log_parser_empty(): mock_log = b''' [PERF] perf block start [PERF]BROKEN!!!!!!!!!1 [PERF]BROKEN!!!!!!!!!1 [PERF]BROKEN!!!!!!!!!1 [PERF]BROKEN!!!!!!!!!1 [PERF]BROKEN!!!!!!!!!1 [PERF] perf block end ''' mock_testcase = "http://localhost:8000/page_load_test/56.com/www.56.com/index.html" expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "title": "", "navigationStart": 0, "unloadEventStart": -1, "unloadEventEnd": -1, "redirectStart": -1, "redirectEnd": -1, "fetchStart": -1, "domainLookupStart": -1, "domainLookupEnd": -1, "connectStart": -1, "connectEnd": -1, "secureConnectionStart": -1, "requestStart": -1, "responseStart": -1, "responseEnd": -1, "domLoading": -1, "domInteractive": -1, "domContentLoadedEventStart": -1, "domContentLoadedEventEnd": -1, "domComplete": -1, "loadEventStart": -1, "loadEventEnd": -1 }] result = runner.parse_log(mock_log, mock_testcase) assert (expected == list(result)) def test_log_parser_error(): mock_log = b'Nothing here! Test failed!' mock_testcase = "http://localhost:8000/page_load_test/56.com/www.56.com/index.html" expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "title": "", "navigationStart": 0, "unloadEventStart": -1, "unloadEventEnd": -1, "redirectStart": -1, "redirectEnd": -1, "fetchStart": -1, "domainLookupStart": -1, "domainLookupEnd": -1, "connectStart": -1, "connectEnd": -1, "secureConnectionStart": -1, "requestStart": -1, "responseStart": -1, "responseEnd": -1, "domLoading": -1, "domInteractive": -1, "domContentLoadedEventStart": -1, "domContentLoadedEventEnd": -1, "domComplete": -1, "loadEventStart": -1, "loadEventEnd": -1 }] result = runner.parse_log(mock_log, mock_testcase) assert (expected == list(result)) def test_log_parser_bad_testcase_name(): mock_testcase = "http://localhost:8000/page_load_test/56.com/www.56.com/index.html" # Notice the testcase is about:blank, servo crashed mock_log = b''' [PERF] perf block start [PERF],testcase,about:blank [PERF],navigationStart,1460358376 [PERF],unloadEventStart,undefined [PERF],unloadEventEnd,undefined [PERF],redirectStart,undefined [PERF],redirectEnd,undefined [PERF],fetchStart,undefined [PERF],domainLookupStart,undefined [PERF],domainLookupEnd,undefined [PERF],connectStart,undefined [PERF],connectEnd,undefined [PERF],secureConnectionStart,undefined [PERF],requestStart,undefined [PERF],responseStart,undefined [PERF],responseEnd,undefined [PERF],domLoading,1460358376000 [PERF],domInteractive,1460358388000 [PERF],domContentLoadedEventStart,1460358388000 [PERF],domContentLoadedEventEnd,1460358388000 [PERF],domComplete,1460358389000 [PERF],loadEventStart,undefined [PERF],loadEventEnd,undefined [PERF] perf block end Shutting down the Constellation after generating an output file or exit flag specified ''' expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "title": "", "navigationStart": 0, "unloadEventStart": -1, "unloadEventEnd": -1, "redirectStart": -1, "redirectEnd": -1, "fetchStart": -1, "domainLookupStart": -1, "domainLookupEnd": -1, "connectStart": -1, "connectEnd": -1, "secureConnectionStart": -1, "requestStart": -1, "responseStart": -1, "responseEnd": -1, "domLoading": -1, "domInteractive": -1, "domContentLoadedEventStart": -1, "domContentLoadedEventEnd": -1, "domComplete": -1, "loadEventStart": -1, "loadEventEnd": -1 }] result = runner.parse_log(mock_log, mock_testcase) assert (expected == list(result)) def test_manifest_loader(): text = ''' http://localhost/page_load_test/tp5n/163.com/www.163.com/index.html http://localhost/page_load_test/tp5n/56.com/www.56.com/index.html http://localhost/page_load_test/tp5n/aljazeera.net/aljazeera.net/portal.html # Disabled! http://localhost/page_load_test/tp5n/aljazeera.net/aljazeera.net/portal.html ''' expected = [ ("http://localhost/page_load_test/tp5n/163.com/www.163.com/index.html", False), ("http://localhost/page_load_test/tp5n/56.com/www.56.com/index.html", False), ("http://localhost/page_load_test/tp5n/aljazeera.net/aljazeera.net/portal.html", False) ] assert (expected == list(runner.parse_manifest(text))) def test_manifest_loader_async(): text = ''' http://localhost/page_load_test/tp5n/163.com/www.163.com/index.html async http://localhost/page_load_test/tp5n/56.com/www.56.com/index.html ''' expected = [ ("http://localhost/page_load_test/tp5n/163.com/www.163.com/index.html", False), ("http://localhost/page_load_test/tp5n/56.com/www.56.com/index.html", True), ] assert (expected == list(runner.parse_manifest(text))) def test_filter_result_by_manifest(): input_json = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/content.html", "domComplete": 1460358389000, }, { "testcase": "non-existing-html", "domComplete": 1460358389000, }, { "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389000, }] expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389000, }] manifest = [ ("http://localhost:8000/page_load_test/56.com/www.56.com/index.html", False) ] assert (expected == runner.filter_result_by_manifest(input_json, manifest)) def test_filter_result_by_manifest_error(): input_json = [{ "testcase": "1.html", "domComplete": 1460358389000, }] manifest = [ ("1.html", False), ("2.html", False) ] with pytest.raises(Exception) as execinfo: runner.filter_result_by_manifest(input_json, manifest) assert "Missing test result" in str(execinfo.value) def test_take_result_median_odd(): input_json = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389001, "domLoading": 1460358380002 }, { "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389002, "domLoading": 1460358380001 }, { "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389003, "domLoading": 1460358380003 }] expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389002, "domLoading": 1460358380002 }] assert (expected == runner.take_result_median(input_json, len(input_json))) def test_take_result_median_even(): input_json = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389001, "domLoading": 1460358380002 }, { "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389002, "domLoading": 1460358380001 }] expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389001.5, "domLoading": 1460358380001.5 }] assert (expected == runner.take_result_median(input_json, len(input_json))) def test_take_result_median_error(): input_json = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": None, "domLoading": 1460358380002 }, { "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389002, "domLoading": 1460358380001 }] expected = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": 1460358389002, "domLoading": 1460358380001.5 }] assert (expected == runner.take_result_median(input_json, len(input_json))) def test_log_result(): results = [{ "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": -1 }, { "testcase": "http://localhost:8000/page_load_test/56.com/www.56.com/index.html", "domComplete": -1 }, { "testcase": "http://localhost:8000/page_load_test/104.com/www.104.com/index.html", "domComplete": 123456789 }] expected = """ ======================================== Total 3 tests; 1 succeeded, 2 failed. Failure summary: - http://localhost:8000/page_load_test/56.com/www.56.com/index.html ======================================== """ assert (expected == runner.format_result_summary(results))