| # Copyright (C) 2010 Google Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are |
| # met: |
| # |
| # * Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # * Redistributions in binary form must reproduce the above |
| # copyright notice, this list of conditions and the following disclaimer |
| # in the documentation and/or other materials provided with the |
| # distribution. |
| # * Neither the name of Google Inc. nor the names of its |
| # contributors may be used to endorse or promote products derived from |
| # this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| try: |
| import jsonresults |
| from jsonresults import JsonResults |
| except ImportError: |
| print("ERROR: Add the TestResultServer, google_appengine and yaml/lib directories to your PYTHONPATH") |
| raise |
| |
| from django.utils import simplejson |
| |
| import unittest |
| |
| |
| JSON_RESULTS_TEMPLATE = ( |
| '{"Webkit":{' |
| '"allFixableCount":[[TESTDATA_COUNT]],' |
| '"buildNumbers":[[TESTDATA_BUILDNUMBERS]],' |
| '"deferredCounts":[[TESTDATA_COUNTS]],' |
| '"fixableCount":[[TESTDATA_COUNT]],' |
| '"fixableCounts":[[TESTDATA_COUNTS]],' |
| '"secondsSinceEpoch":[[TESTDATA_TIMES]],' |
| '"tests":{[TESTDATA_TESTS]},' |
| '"webkitRevision":[[TESTDATA_WEBKITREVISION]],' |
| '"wontfixCounts":[[TESTDATA_COUNTS]]' |
| '},' |
| '"version":[VERSION]' |
| '}') |
| |
| JSON_RESULTS_COUNTS_TEMPLATE = ( |
| '{' |
| '"C":[TESTDATA],' |
| '"F":[TESTDATA],' |
| '"I":[TESTDATA],' |
| '"O":[TESTDATA],' |
| '"P":[TESTDATA],' |
| '"T":[TESTDATA],' |
| '"X":[TESTDATA],' |
| '"Z":[TESTDATA]}') |
| |
| JSON_RESULTS_DIRECTORY_TEMPLATE = '[[TESTDATA_DIRECTORY]]:{[TESTDATA_DATA]}' |
| |
| JSON_RESULTS_TESTS_TEMPLATE = ( |
| '[[TESTDATA_TEST_NAME]]:{' |
| '"results":[[TESTDATA_TEST_RESULTS]],' |
| '"times":[[TESTDATA_TEST_TIMES]]}') |
| |
| JSON_RESULTS_TEST_LIST_TEMPLATE = ( |
| '{"Webkit":{"tests":{[TESTDATA_TESTS]}}}') |
| |
| |
| class JsonResultsTest(unittest.TestCase): |
| def setUp(self): |
| self._builder = "Webkit" |
| |
| def test_strip_prefix_suffix(self): |
| json = "['contents']" |
| self.assertEqual(JsonResults._strip_prefix_suffix("ADD_RESULTS(" + json + ");"), json) |
| self.assertEqual(JsonResults._strip_prefix_suffix(json), json) |
| |
| def _make_test_json(self, test_data): |
| if not test_data: |
| return "" |
| |
| builds = test_data["builds"] |
| tests = test_data["tests"] |
| if not builds or not tests: |
| return "" |
| |
| json = JSON_RESULTS_TEMPLATE |
| |
| counts = [] |
| build_numbers = [] |
| webkit_revision = [] |
| times = [] |
| for build in builds: |
| counts.append(JSON_RESULTS_COUNTS_TEMPLATE.replace("[TESTDATA]", build)) |
| build_numbers.append("1000%s" % build) |
| webkit_revision.append("2000%s" % build) |
| times.append("100000%s000" % build) |
| |
| json = json.replace("[TESTDATA_COUNTS]", ",".join(counts)) |
| json = json.replace("[TESTDATA_COUNT]", ",".join(builds)) |
| json = json.replace("[TESTDATA_BUILDNUMBERS]", ",".join(build_numbers)) |
| json = json.replace("[TESTDATA_WEBKITREVISION]", ",".join(webkit_revision)) |
| json = json.replace("[TESTDATA_TIMES]", ",".join(times)) |
| |
| version = str(test_data["version"]) if "version" in test_data else "4" |
| json = json.replace("[VERSION]", version) |
| json = json.replace("{[TESTDATA_TESTS]}", simplejson.dumps(tests, separators=(',', ':'), sort_keys=True)) |
| return json |
| |
| def _test_merge(self, aggregated_data, incremental_data, expected_data, max_builds=jsonresults.JSON_RESULTS_MAX_BUILDS): |
| aggregated_results = self._make_test_json(aggregated_data) |
| incremental_results = self._make_test_json(incremental_data) |
| merged_results = JsonResults.merge(self._builder, aggregated_results, incremental_results, max_builds, sort_keys=True) |
| |
| if expected_data: |
| expected_results = self._make_test_json(expected_data) |
| self.assertEqual(merged_results, expected_results) |
| else: |
| self.assertFalse(merged_results) |
| |
| def _test_get_test_list(self, input_data, expected_data): |
| input_results = self._make_test_json(input_data) |
| expected_results = JSON_RESULTS_TEST_LIST_TEMPLATE.replace("{[TESTDATA_TESTS]}", simplejson.dumps(expected_data, separators=(',', ':'))) |
| actual_results = JsonResults.get_test_list(self._builder, input_results) |
| self.assertEqual(actual_results, expected_results) |
| |
| def test_merge_null_incremental_results(self): |
| # Empty incremental results json. |
| # Nothing to merge. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}, |
| # Incremental results |
| None, |
| # Expect no merge happens. |
| None) |
| |
| def test_merge_empty_incremental_results(self): |
| # No actual incremental test results (only prefix and suffix) to merge. |
| # Nothing to merge. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}, |
| # Incremental results |
| {"builds": [], |
| "tests": {}}, |
| # Expected no merge happens. |
| None) |
| |
| def test_merge_empty_aggregated_results(self): |
| # No existing aggregated results. |
| # Merged results == new incremental results. |
| self._test_merge( |
| # Aggregated results |
| None, |
| # Incremental results |
| |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}, |
| # Expected result |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}) |
| |
| def test_merge_duplicate_build_number(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[100, "F"]], |
| "times": [[100, 0]]}}}, |
| # Incremental results |
| {"builds": ["2"], |
| "tests": {"001.html": { |
| "results": [[1, "F"]], |
| "times": [[1, 0]]}}}, |
| # Expected results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[100, "F"]], |
| "times": [[100, 0]]}}}) |
| |
| def test_merge_incremental_single_test_single_run_same_result(self): |
| # Incremental results has the latest build and same test results for |
| # that run. |
| # Insert the incremental results at the first place and sum number |
| # of runs for "F" (200 + 1) to get merged results. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[201,"F"]], |
| "times": [[201,0]]}}}) |
| |
| def test_merge_single_test_single_run_different_result(self): |
| # Incremental results has the latest build but different test results |
| # for that run. |
| # Insert the incremental results at the first place. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1, "I"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[1,"I"],[200,"F"]], |
| "times": [[1,1],[200,0]]}}}) |
| |
| def test_merge_single_test_single_run_result_changed(self): |
| # Incremental results has the latest build but results which differ from |
| # the latest result (but are the same as an older result). |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"],[10,"I"]], |
| "times": [[200,0],[10,1]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"I"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[1,"I"],[200,"F"],[10,"I"]], |
| "times": [[1,1],[200,0],[10,1]]}}}) |
| |
| def test_merge_multiple_tests_single_run(self): |
| # All tests have incremental updates. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}, |
| "002.html": { |
| "results": [[100,"I"]], |
| "times": [[100,1]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}, |
| "002.html": { |
| "results": [[1,"I"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[201,"F"]], |
| "times": [[201,0]]}, |
| "002.html": { |
| "results": [[101,"I"]], |
| "times": [[101,1]]}}}) |
| |
| def test_merge_multiple_tests_single_run_one_no_result(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}, |
| "002.html": { |
| "results": [[100,"I"]], |
| "times": [[100,1]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"002.html": { |
| "results": [[1,"I"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[1,"N"],[200,"F"]], |
| "times": [[201,0]]}, |
| "002.html": { |
| "results": [[101,"I"]], |
| "times": [[101,1]]}}}) |
| |
| def test_merge_single_test_multiple_runs(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}}}, |
| # Incremental results |
| {"builds": ["4", "3"], |
| "tests": {"001.html": { |
| "results": [[2, "I"]], |
| "times": [[2,2]]}}}, |
| # Expected results |
| {"builds": ["4", "3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[2,"I"],[200,"F"]], |
| "times": [[2,2],[200,0]]}}}) |
| |
| def test_merge_multiple_tests_multiple_runs(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"F"]], |
| "times": [[200,0]]}, |
| "002.html": { |
| "results": [[10,"Z"]], |
| "times": [[10,0]]}}}, |
| # Incremental results |
| {"builds": ["4", "3"], |
| "tests": {"001.html": { |
| "results": [[2, "I"]], |
| "times": [[2,2]]}, |
| "002.html": { |
| "results": [[1,"C"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["4", "3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[2,"I"],[200,"F"]], |
| "times": [[2,2],[200,0]]}, |
| "002.html": { |
| "results": [[1,"C"],[10,"Z"]], |
| "times": [[1,1],[10,0]]}}}) |
| |
| def test_merge_incremental_result_older_build(self): |
| # Test the build in incremental results is older than the most recent |
| # build in aggregated results. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["3", "1"], |
| "tests": {"001.html": { |
| "results": [[5,"F"]], |
| "times": [[5,0]]}}}, |
| # Incremental results |
| {"builds": ["2"], |
| "tests": {"001.html": { |
| "results": [[1, "F"]], |
| "times": [[1,0]]}}}, |
| # Expected no merge happens. |
| {"builds": ["2", "3", "1"], |
| "tests": {"001.html": { |
| "results": [[6,"F"]], |
| "times": [[6,0]]}}}) |
| |
| def test_merge_incremental_result_same_build(self): |
| # Test the build in incremental results is same as the build in |
| # aggregated results. |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[5,"F"]], |
| "times": [[5,0]]}}}, |
| # Incremental results |
| {"builds": ["3", "2"], |
| "tests": {"001.html": { |
| "results": [[2, "F"]], |
| "times": [[2,0]]}}}, |
| # Expected no merge happens. |
| {"builds": ["3", "2", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[7,"F"]], |
| "times": [[7,0]]}}}) |
| |
| def test_merge_remove_new_test(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[199, "F"]], |
| "times": [[199, 0]]}, |
| }}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1, "F"]], |
| "times": [[1, 0]]}, |
| "002.html": { |
| "results": [[1, "P"]], |
| "times": [[1, 0]]}, |
| "003.html": { |
| "results": [[1, "N"]], |
| "times": [[1, 0]]}, |
| "004.html": { |
| "results": [[1, "X"]], |
| "times": [[1, 0]]}, |
| }}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[200, "F"]], |
| "times": [[200, 0]]}, |
| }}, |
| max_builds=200) |
| |
| |
| def test_merge_remove_test(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"P"]], |
| "times": [[200,0]]}, |
| "002.html": { |
| "results": [[10,"F"]], |
| "times": [[10,0]]}, |
| "003.html": { |
| "results": [[190, 'X'], [9, 'N'], [1,"F"]], |
| "times": [[200,0]]}, |
| }}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"P"]], |
| "times": [[1,0]]}, |
| "002.html": { |
| "results": [[1,"P"]], |
| "times": [[1,0]]}, |
| "003.html": { |
| "results": [[1,"P"]], |
| "times": [[1,0]]}, |
| }}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"002.html": { |
| "results": [[1,"P"],[10,"F"]], |
| "times": [[11,0]]}}}, |
| max_builds=200) |
| |
| def test_merge_keep_test_with_all_pass_but_slow_time(self): |
| # Do not remove test where all run pass but max running time >= 5 seconds |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[200,"P"]], |
| "times": [[200,jsonresults.JSON_RESULTS_MIN_TIME]]}, |
| "002.html": { |
| "results": [[10,"F"]], |
| "times": [[10,0]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"P"]], |
| "times": [[1,1]]}, |
| "002.html": { |
| "results": [[1,"P"]], |
| "times": [[1,0]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[201,"P"]], |
| "times": [[1,1],[200,jsonresults.JSON_RESULTS_MIN_TIME]]}, |
| "002.html": { |
| "results": [[1,"P"],[10,"F"]], |
| "times": [[11,0]]}}}) |
| |
| def test_merge_prune_extra_results(self): |
| # Remove items from test results and times that exceed the max number |
| # of builds to track. |
| max_builds = jsonresults.JSON_RESULTS_MAX_BUILDS |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[max_builds,"F"],[1,"I"]], |
| "times": [[max_builds,0],[1,1]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"T"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[1,"T"],[max_builds,"F"]], |
| "times": [[1,1],[max_builds,0]]}}}) |
| |
| def test_merge_prune_extra_results_small(self): |
| # Remove items from test results and times that exceed the max number |
| # of builds to track, using smaller threshold. |
| max_builds = jsonresults.JSON_RESULTS_MAX_BUILDS_SMALL |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[max_builds,"F"],[1,"I"]], |
| "times": [[max_builds,0],[1,1]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"T"]], |
| "times": [[1,1]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[1,"T"],[max_builds,"F"]], |
| "times": [[1,1],[max_builds,0]]}}}, |
| int(max_builds)) |
| |
| def test_merge_prune_extra_results_with_new_result_of_same_type(self): |
| # Test that merging in a new result of the same type as the last result |
| # causes old results to fall off. |
| max_builds = jsonresults.JSON_RESULTS_MAX_BUILDS_SMALL |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"001.html": { |
| "results": [[max_builds,"F"],[1,"N"]], |
| "times": [[max_builds,0],[1,1]]}}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"001.html": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"001.html": { |
| "results": [[max_builds,"F"]], |
| "times": [[max_builds,0]]}}}, |
| int(max_builds)) |
| |
| # FIXME: Some data got corrupted and has results and times at the directory level. |
| # Once we've purged this from all the data, we should throw an error on this case. |
| def test_merge_directory_hierarchy_extra_results_and_times(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"baz": { |
| "003.html": { |
| "results": [[25,"F"]], |
| "times": [[25,0]]}}, |
| "results": [[25,"F"]], |
| "times": [[25,0]]}}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"baz": { |
| "003.html": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}}}}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"baz": { |
| "003.html": { |
| "results": [[26,"F"]], |
| "times": [[26,0]]}}}, |
| "version": 4}) |
| |
| def test_merge_build_directory_hierarchy(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"bar": {"baz": { |
| "003.html": { |
| "results": [[25,"F"]], |
| "times": [[25,0]]}}}, |
| "foo": { |
| "001.html": { |
| "results": [[50,"F"]], |
| "times": [[50,0]]}, |
| "002.html": { |
| "results": [[100,"I"]], |
| "times": [[100,0]]}}}, |
| "version": 4}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"baz": { |
| "004.html": { |
| "results": [[1,"I"]], |
| "times": [[1,0]]}}, |
| "foo": { |
| "001.html": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}, |
| "002.html": { |
| "results": [[1,"I"]], |
| "times": [[1,0]]}}}, |
| "version": 4}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"bar": {"baz": { |
| "003.html": { |
| "results": [[1,"N"],[25,"F"]], |
| "times": [[26,0]]}}}, |
| "baz": { |
| "004.html": { |
| "results": [[1,"I"]], |
| "times": [[1,0]]}}, |
| "foo": { |
| "001.html": { |
| "results": [[51,"F"]], |
| "times": [[51,0]]}, |
| "002.html": { |
| "results": [[101,"I"]], |
| "times": [[101,0]]}}}, |
| "version": 4}) |
| |
| # FIXME(aboxhall): Add some tests for xhtml/svg test results. |
| |
| def test_get_test_name_list(self): |
| # Get test name list only. Don't include non-test-list data and |
| # of test result details. |
| # FIXME: This also tests a temporary bug in the data where directory-level |
| # results have a results and times values. Once that bug is fixed, |
| # remove this test-case and assert we don't ever hit it. |
| self._test_get_test_list( |
| # Input results |
| {"builds": ["3", "2", "1"], |
| "tests": {"foo": { |
| "001.html": { |
| "results": [[200,"P"]], |
| "times": [[200,0]]}, |
| "results": [[1,"N"]], |
| "times": [[1,0]]}, |
| "002.html": { |
| "results": [[10,"F"]], |
| "times": [[10,0]]}}}, |
| # Expected results |
| {"foo": {"001.html":{}}, "002.html":{}}) |
| |
| def test_gtest(self): |
| self._test_merge( |
| # Aggregated results |
| {"builds": ["2", "1"], |
| "tests": {"foo.bar": { |
| "results": [[50,"F"]], |
| "times": [[50,0]]}, |
| "foo.bar2": { |
| "results": [[100,"I"]], |
| "times": [[100,0]]}, |
| }, |
| "version": 3}, |
| # Incremental results |
| {"builds": ["3"], |
| "tests": {"foo.bar2": { |
| "results": [[1,"I"]], |
| "times": [[1,0]]}, |
| "foo.bar3": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}, |
| }, |
| "version": 4}, |
| # Expected results |
| {"builds": ["3", "2", "1"], |
| "tests": {"foo.bar": { |
| "results": [[1, "N"], [50,"F"]], |
| "times": [[51,0]]}, |
| "foo.bar2": { |
| "results": [[101,"I"]], |
| "times": [[101,0]]}, |
| "foo.bar3": { |
| "results": [[1,"F"]], |
| "times": [[1,0]]}, |
| }, |
| "version": 4}) |
| |
| if __name__ == '__main__': |
| unittest.main() |