Commit c577382e by Diego Novillo Committed by Diego Novillo

Implement support for expiring expected results in validate_failures.py.

I noticed recently that while the validator was accepting the
'expire=YYYYMMDD' attribute, it was not actually doing anything with
it.

This patch fixes the oversight.

2012-08-13  Diego Novillo  <dnovillo@google.com>

	* testsuite-management/validate_failures.py: Import datetime.
	(TestResult.ExpirationDate): New.
	(TestResult.HasExpired): New.
	(ParseSummary): Call it.  If it returns True, warn that the
	expected failure has expired and do not add it to the set of
	expected results.
	(GetResults): Clarify documentation.

From-SVN: r190351
parent 621bc046
2012-08-13 Diego Novillo <dnovillo@google.com>
* testsuite-management/validate_failures.py: Import datetime.
(TestResult.ExpirationDate): New.
(TestResult.HasExpired): New.
(ParseSummary): Call it. If it returns True, warn that the
expected failure has expired and do not add it to the set of
expected results.
(GetResults): Clarify documentation.
2012-07-26 Diego Novillo <dnovillo@google.com> 2012-07-26 Diego Novillo <dnovillo@google.com>
* testsuite-management/validate_failures.py: Do not use * testsuite-management/validate_failures.py: Do not use
......
...@@ -46,6 +46,7 @@ executed it will: ...@@ -46,6 +46,7 @@ executed it will:
with exit code 0. Otherwise, it exits with error code 1. with exit code 0. Otherwise, it exits with error code 1.
""" """
import datetime
import optparse import optparse
import os import os
import re import re
...@@ -135,6 +136,26 @@ class TestResult(object): ...@@ -135,6 +136,26 @@ class TestResult(object):
attrs = '%s | ' % self.attrs attrs = '%s | ' % self.attrs
return '%s%s: %s %s' % (attrs, self.state, self.name, self.description) return '%s%s: %s %s' % (attrs, self.state, self.name, self.description)
def ExpirationDate(self):
# Return a datetime.date object with the expiration date for this
# test result expires. Return None, if no expiration # has been set.
if re.search(r'expire=', self.attrs):
expiration = re.search(r'expire=(\d\d\d\d)(\d\d)(\d\d)', self.attrs)
if not expiration:
Error('Invalid expire= format in "%s". Must be of the form '
'"expire=YYYYMMDD"' % self)
return datetime.date(int(expiration.group(1)),
int(expiration.group(2)),
int(expiration.group(3)))
return None
def HasExpired(self):
# Return True if the expiration date of this result has passed.
expiration_date = self.ExpirationDate()
if expiration_date:
now = datetime.date.today()
return now > expiration_date
def GetMakefileValue(makefile_name, value_name): def GetMakefileValue(makefile_name, value_name):
if os.path.exists(makefile_name): if os.path.exists(makefile_name):
...@@ -178,7 +199,13 @@ def ParseSummary(sum_fname): ...@@ -178,7 +199,13 @@ def ParseSummary(sum_fname):
sum_file = open(sum_fname) sum_file = open(sum_fname)
for line in sum_file: for line in sum_file:
if IsInterestingResult(line): if IsInterestingResult(line):
result_set.add(TestResult(line)) result = TestResult(line)
if result.HasExpired():
# Tests that had an expiration set are not added to the
# set of expected results.
print 'WARNING: Expected failure "%s" has expired.' % line.strip()
continue
result_set.add(result)
sum_file.close() sum_file.close()
return result_set return result_set
...@@ -220,16 +247,20 @@ def GetResults(sum_files): ...@@ -220,16 +247,20 @@ def GetResults(sum_files):
def CompareResults(manifest, actual): def CompareResults(manifest, actual):
"""Compare sets of results and return two lists: """Compare sets of results and return two lists:
- List of results present in MANIFEST but missing from ACTUAL.
- List of results present in ACTUAL but missing from MANIFEST. - List of results present in ACTUAL but missing from MANIFEST.
- List of results present in MANIFEST but missing from ACTUAL.
""" """
# Report all the actual results not present in the manifest. # Collect all the actual results not present in the manifest.
# Results in this set will be reported as errors.
actual_vs_manifest = set() actual_vs_manifest = set()
for actual_result in actual: for actual_result in actual:
if actual_result not in manifest: if actual_result not in manifest:
actual_vs_manifest.add(actual_result) actual_vs_manifest.add(actual_result)
# Simlarly for all the tests in the manifest. # Collect all the tests in the manifest that were not found
# in the actual results.
# Results in this set will be reported as warnings (since
# they are expected failures that are not failing anymore).
manifest_vs_actual = set() manifest_vs_actual = set()
for expected_result in manifest: for expected_result in manifest:
# Ignore tests marked flaky. # Ignore tests marked flaky.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment