tests: Update tests to save output on failure
authorJason Lowe-Power <jason@lowepower.com>
Wed, 17 Jul 2019 00:16:16 +0000 (17:16 -0700)
committerJason Lowe-Power <power.jg@gmail.com>
Sat, 2 May 2020 00:23:39 +0000 (00:23 +0000)
The previous commit which tried to do this, did not work with parallel
execution. In this case, the fixtures that were modified were in the
child process and the parent process's fixtures were never updated.
Instead of modifying the object, use the information passed in from the
testlib.

See 4c28149ffa5d09e6fe14952dcaf8df5d0cd8f328
Previous review:
https://gem5-review.googlesource.com/c/public/gem5/+/17451

Change-Id: Ib4c06c5e3f82994199d6f0c1fa69452e93444d75
Signed-off-by: Jason Lowe-Power <jason@lowepower.com>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/19529
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
tests/gem5/fixture.py
tests/gem5/verifier.py

index aa316e706e2eb6b39f1cd3f031999903a191858d..fc31b30c67b0f8eb31f4df82c5ec60540832712d 100644 (file)
@@ -49,6 +49,7 @@ from testlib.fixture import Fixture
 from testlib.config import config, constants
 from testlib.helper import log_call, cacheresult, joinpath, absdirpath
 import testlib.log as log
+from testlib.state import Result
 
 
 class VariableFixture(Fixture):
@@ -67,13 +68,9 @@ class TempdirFixture(Fixture):
         self.path = tempfile.mkdtemp(prefix='gem5out')
 
     def teardown(self, testitem):
-        if self.path is not None:
+        if testitem.result == Result.Passed:
             shutil.rmtree(self.path)
 
-    def skip_cleanup(self):
-        # Set path to none so it's not deleted
-        self.path = None
-
 class UniqueFixture(Fixture):
     '''
     Base class for fixtures that generate a target in the
index 73a7499c731497f612bf64385ee39ec18fca3a61..c955c407df13daa58080220651b314d211eb088b 100644 (file)
@@ -47,16 +47,6 @@ class Verifier(object):
         return test.TestFunction(self._test,
                 name=name, fixtures=self.fixtures)
 
-    def failed(self, fixtures):
-        '''
-        Called if this verifier fails to cleanup (or not) as needed.
-        '''
-        try:
-            fixtures[constants.tempdir_fixture_name].skip_cleanup()
-        except KeyError:
-            pass # No need to do anything if the tempdir fixture doesn't exist
-
-
 class MatchGoldStandard(Verifier):
     '''
     Compares a standard output to the test output and passes if they match,
@@ -90,7 +80,6 @@ class MatchGoldStandard(Verifier):
                             ignore_regexes=self.ignore_regex,
                             logger=params.log)
         if diff is not None:
-            self.failed(fixtures)
             test.fail('Stdout did not match:\n%s\nSee %s for full results'
                       % (diff, tempdir))
 
@@ -195,7 +184,6 @@ class MatchRegex(Verifier):
             if parse_file(joinpath(tempdir,
                                    constants.gem5_simulation_stderr)):
                 return # Success
-        self.failed(fixtures)
         test.fail('Could not match regex.')
 
 _re_type = type(re.compile(''))