This adds an optional argument to the constructor for a results file. This fixes a race condition where a TestrunResult is created, some entries are added, and then parseFile is called, which overwrites the contents of the TestrunResult.
Signed-off-by: Dylan Baker <baker.dyla...@gmail.com> --- framework/core.py | 45 ++++++++++++++++++++++----------------------- framework/summary.py | 4 ++-- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/framework/core.py b/framework/core.py index 752d98c..f003a44 100644 --- a/framework/core.py +++ b/framework/core.py @@ -278,7 +278,7 @@ class GroupResult(dict): class TestrunResult: - def __init__(self): + def __init__(self, resultfile=None): self.serialized_keys = ['options', 'name', 'tests', @@ -292,6 +292,25 @@ class TestrunResult: self.time_elapsed = None self.tests = {} + if resultfile: + # Attempt to open the json file normally, if it fails then attempt + # to repair it. + try: + raw_dict = json.load(resultfile) + except ValueError: + raw_dict = json.load(self.__repairFile(resultfile)) + + # Check that only expected keys were unserialized. + for key in raw_dict: + if key not in self.serialized_keys: + raise Exception('unexpected key in results file: ', str(key)) + + self.__dict__.update(raw_dict) + + # Replace each raw dict in self.tests with a TestResult. + for (path, result) in self.tests.items(): + self.tests[path] = TestResult(result) + def __repairFile(self, file): ''' Reapair JSON file if necessary @@ -360,25 +379,6 @@ class TestrunResult: raw_dict = dict([(k, self.__dict__[k]) for k in keys]) json.dump(raw_dict, file, indent=JSONWriter.INDENT) - def parseFile(self, file): - # Attempt to open the json file normally, if it fails then attempt to - # repair it. - try: - raw_dict = json.load(file) - except ValueError: - raw_dict = json.load(self.__repairFile(file)) - - # Check that only expected keys were unserialized. - for key in raw_dict: - if key not in self.serialized_keys: - raise Exception('unexpected key in results file: ', str(key)) - - self.__dict__.update(raw_dict) - - # Replace each raw dict in self.tests with a TestResult. - for (path, result) in self.tests.items(): - self.tests[path] = TestResult(result) - class Environment: def __init__(self, concurrent=True, execute=True, include_filter=[], @@ -616,10 +616,9 @@ def loadTestResults(relativepath): else: filepath = path - testrun = TestrunResult() try: - with open(filepath, 'r') as file: - testrun.parseFile(file) + with open(filepath, 'r') as resultfile: + testrun = TestrunResult(resultfile) except OSError: traceback.print_exc() raise Exception('Could not read tests results') diff --git a/framework/summary.py b/framework/summary.py index 1a15fa7..7afbe7b 100644 --- a/framework/summary.py +++ b/framework/summary.py @@ -43,10 +43,10 @@ def load_result(resultfile): # is a folder containing a json file try: with open(resultfile, 'r') as file: - result.parseFile(file) + result = TestrunResult(file) except IOError: with open(path.join(resultfile, 'main'), 'r') as file: - result.parseFile(file) + result = TestrunResult(file) return result -- 1.8.1.5 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit