# Copyright 2011 Google Inc. All Rights Reserved. # Author: kbaclawski@google.com (Krystian Baclawski) # __author__ = 'kbaclawski@google.com (Krystian Baclawski)' from collections import namedtuple from cStringIO import StringIO import logging from summary import DejaGnuTestResult class Manifest(namedtuple('Manifest', 'tool board results')): """Stores a list of unsuccessful tests. Any line that starts with '#@' marker carries auxiliary data in form of a key-value pair, for example: #@ tool: * #@ board: unix So far tool and board parameters are recognized. Their value can contain arbitrary glob expression. Based on aforementioned parameters given manifest will be applied for all test results, but only in selected test runs. Note that all parameters are optional. Their default value is '*' (i.e. for all tools/boards). The meaning of lines above is as follows: corresponding test results to follow should only be suppressed if test run was performed on "unix" board. The summary line used to build the test result should have this format: attrlist | UNRESOLVED: gcc.dg/unroll_1.c (test for excess errors) ^^^^^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^ optional result name variant attributes """ SUPPRESSIBLE_RESULTS = ['FAIL', 'UNRESOLVED', 'XPASS', 'ERROR'] @classmethod def FromDejaGnuTestRun(cls, test_run): results = [result for result in test_run.results if result.result in cls.SUPPRESSIBLE_RESULTS] return cls(test_run.tool, test_run.board, results) @classmethod def FromFile(cls, filename): """Creates manifest instance from a file in format described above.""" params = {} results = [] with open(filename, 'r') as manifest_file: for line in manifest_file: if line.startswith('#@'): # parse a line with a parameter try: key, value = line[2:].split(':', 1) except ValueError: logging.warning('Malformed parameter line: "%s".', line) else: params[key.strip()] = value.strip() else: # remove comment try: line, _ = line.split('#', 1) except ValueError: pass line = line.strip() if line: # parse a line with a test result result = DejaGnuTestResult.FromLine(line) if result: results.append(result) else: logging.warning('Malformed test result line: "%s".', line) tool = params.get('tool', '*') board = params.get('board', '*') return cls(tool, board, results) def Generate(self): """Dumps manifest to string.""" text = StringIO() for name in ['tool', 'board']: text.write('#@ {0}: {1}\n'.format(name, getattr(self, name))) text.write('\n') for result in sorted(self.results, key=lambda r: r.result): text.write('{0}\n'.format(result)) return text.getvalue() def __iter__(self): return iter(self.results)