The checking in TestrunResult to determine if a file was proper json or not is very fragile: it assumes that the last line of the file will be }. Sometimes this triggers and rebuilds a valid json file, dropping the last test and resulting in python overhead.
This patch replaces that check with a try/except block. This block attempts to load the json file with json.loads, and on failure attempts to fix the json. V2: - replaces json.loads with json.load: this was causing an error but being caught by the except block. - Corrects issue created by the try block chaging file.tell() so that file.seek would fail in self.__repairFile() Signed-off-by: Dylan Baker <baker.dyla...@gmail.com> --- framework/core.py | 46 ++++++++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/framework/core.py b/framework/core.py index 14a8161..f415508 100644 --- a/framework/core.py +++ b/framework/core.py @@ -297,14 +297,8 @@ class TestrunResult: is returned. ''' - saved_position = file.tell() + file.seek(0) lines = file.readlines() - file.seek(saved_position) - - if lines[-1] == '}': - # JSON object was closed properly. No repair is - # necessary. - return file # JSON object was not closed properly. # @@ -353,19 +347,31 @@ class TestrunResult: json.dump(raw_dict, file, indent=JSONWriter.INDENT) def parseFile(self, file): - file = self.__repairFile(file) - raw_dict = json.load(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) + # Attempt to open the json file normally, if it fails then attempt to + # repair it. + try: + results = json.load(file) + self.name = results['name'] + self.glxinfo = results['glxinfo'] + self.lspci = results['lspci'] + self.time_elapsed = results['time_elapsed'] + self.tests = results['tests'] + self.options = results['options'] + except ValueError: + file = self.__repairFile(file) + raw_dict = json.load(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) ############################################################################# ##### Generic Test classes -- 1.8.1.4 _______________________________________________ Piglit mailing list Piglit@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/piglit