summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorNikos Nikoleris <nikos.nikoleris@arm.com>2019-06-18 11:50:24 +0100
committerNikos Nikoleris <nikos.nikoleris@arm.com>2019-08-09 14:03:21 +0000
commit8282b7408b68187155e8109ba4dd267f5bac2c94 (patch)
treebc2dccba05924152defe59c2f058a58efccabd77 /ext
parent52189147737c7b2c727e42e07676547083469dff (diff)
downloadgem5-8282b7408b68187155e8109ba4dd267f5bac2c94.tar.xz
tests: Refactor the Gem5Fixture to derive from UniqueFixture
Gem5Fixture is used to define a fixture for building the gem5 binary. Most tests are expected to define their own Gem5Fixture, however, as some might depend on the same binary (e.g., ./build/ARM/gem5.opt), they will try to re-define a fixture for the same target. This patchset changes Gem5Fixture to derive from UniqueFixture. In addition, this patchset changes the way global fixtures are discovered to work with the new Gem5Fixture class. Instead of enumerating them when test definitions are loaded, we do so after the tests have been filtered according to specified tags (e.g., include opt variant, exclude fast, debug variants). Change-Id: Ie868a7e18ef6c3271f3c8a658229657cd43997cb Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/19251 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Maintainer: Giacomo Travaglini <giacomo.travaglini@arm.com>
Diffstat (limited to 'ext')
-rw-r--r--ext/testlib/fixture.py28
-rw-r--r--ext/testlib/loader.py5
-rw-r--r--ext/testlib/main.py14
-rw-r--r--ext/testlib/wrappers.py29
4 files changed, 26 insertions, 50 deletions
diff --git a/ext/testlib/fixture.py b/ext/testlib/fixture.py
index be8924474..7af6cb289 100644
--- a/ext/testlib/fixture.py
+++ b/ext/testlib/fixture.py
@@ -32,8 +32,6 @@ import traceback
import helper
import log
-global_fixtures = []
-
class SkipException(Exception):
def __init__(self, fixture, testitem):
self.fixture = fixture
@@ -71,21 +69,11 @@ class Fixture(object):
if name is None:
name = self.__class__.__name__
self.name = name
+ self._is_global = False
def skip(self, testitem):
raise SkipException(self.name, testitem.metadata)
- def schedule_finalized(self, schedule):
- '''
- This method is called once the schedule of for tests is known.
- To enable tests to use the same fixture defintion for each execution
- fixtures must return a copy of themselves in this method.
-
- :returns: a copy of this fixture which will be setup/torndown
- when the test item this object is tied to is about to execute.
- '''
- return self.copy()
-
def init(self, *args, **kwargs):
pass
@@ -95,9 +83,6 @@ class Fixture(object):
def teardown(self, testitem):
pass
- def copy(self):
- return copy.deepcopy(self)
-
def skip_cleanup(self):
'''
If this method is called, then we should make sure that nothing is
@@ -105,11 +90,8 @@ class Fixture(object):
'''
pass
+ def set_global(self):
+ self._is_global = True
-def globalfixture(fixture):
- '''
- Store the given fixture as a global fixture. Its setup() method
- will be called before the first test is executed.
- '''
- global_fixtures.append(fixture)
- return fixture
+ def is_global(self):
+ return self._is_global
diff --git a/ext/testlib/loader.py b/ext/testlib/loader.py
index e788c33a9..8f8f60e70 100644
--- a/ext/testlib/loader.py
+++ b/ext/testlib/loader.py
@@ -147,7 +147,7 @@ class Loader(object):
@property
def schedule(self):
- return wrappers.LoadedLibrary(self.suites, fixture_mod.global_fixtures)
+ return wrappers.LoadedLibrary(self.suites)
def load_schedule_for_suites(self, *uids):
files = {uid.UID.uid_to_path(id_) for id_ in uids}
@@ -155,8 +155,7 @@ class Loader(object):
self.load_file(file_)
return wrappers.LoadedLibrary(
- [self.suite_uids[id_] for id_ in uids],
- fixture_mod.global_fixtures)
+ [self.suite_uids[id_] for id_ in uids])
def _verify_no_duplicate_suites(self, new_suites):
new_suite_uids = self.suite_uids.copy()
diff --git a/ext/testlib/main.py b/ext/testlib/main.py
index ac795473d..cbba0005f 100644
--- a/ext/testlib/main.py
+++ b/ext/testlib/main.py
@@ -254,20 +254,6 @@ def run_schedule(test_schedule, log_handler):
log_handler.schedule_finalized(test_schedule)
- # Iterate through all fixtures notifying them of the test schedule.
- for suite in test_schedule:
- copied_fixtures = []
- for fixture in suite.fixtures:
- copied_fixtures.append(fixture.schedule_finalized(test_schedule))
- suite.fixtures = copied_fixtures
-
- for test in suite:
- copied_fixtures = []
- for fixture in test.fixtures:
- copied_fixtures.append(fixture.schedule_finalized(
- test_schedule))
- test.fixtures = copied_fixtures
-
log.test_log.message(terminal.separator())
log.test_log.message('Running Tests from {} suites'
.format(len(test_schedule.suites)), bold=True)
diff --git a/ext/testlib/wrappers.py b/ext/testlib/wrappers.py
index 4e96f3629..4bd22a468 100644
--- a/ext/testlib/wrappers.py
+++ b/ext/testlib/wrappers.py
@@ -1,3 +1,15 @@
+# Copyright (c) 2019 ARM Limited
+# All rights reserved
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder. You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
# Copyright (c) 2017 Mark D. Hill and David A. Wood
# All rights reserved.
#
@@ -179,9 +191,8 @@ class LoadedLibrary(LoadedTestable):
Wraps a collection of all loaded test suites and
provides utility functions for accessing fixtures.
'''
- def __init__(self, suites, global_fixtures):
+ def __init__(self, suites):
LoadedTestable.__init__(self, suites)
- self.global_fixtures = global_fixtures
def _generate_metadata(self):
return LibraryMetadata( **{
@@ -196,19 +207,13 @@ class LoadedLibrary(LoadedTestable):
'''
return iter(self.obj)
- def all_fixture_tuples(self):
- return itertools.chain(
- self.global_fixtures,
- *(suite.fixtures for suite in self.obj))
-
def all_fixtures(self):
'''
:returns: an interator overall all global, suite,
and test fixtures
'''
return itertools.chain(itertools.chain(
- self.global_fixtures,
- *(suite.fixtures for suite in self.obj)),
+ *(suite.fixtures for suite in self.obj)),
*(self.test_fixtures(suite) for suite in self.obj)
)
@@ -221,7 +226,11 @@ class LoadedLibrary(LoadedTestable):
@property
def fixtures(self):
- return self.global_fixtures
+ global_fixtures = []
+ for fixture in self.all_fixtures():
+ if fixture.is_global():
+ global_fixtures.append(fixture)
+ return global_fixtures
@property
def uid(self):