diff options
author | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2019-06-18 11:50:24 +0100 |
---|---|---|
committer | Nikos Nikoleris <nikos.nikoleris@arm.com> | 2019-08-09 14:03:21 +0000 |
commit | 8282b7408b68187155e8109ba4dd267f5bac2c94 (patch) | |
tree | bc2dccba05924152defe59c2f058a58efccabd77 /tests | |
parent | 52189147737c7b2c727e42e07676547083469dff (diff) | |
download | gem5-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 'tests')
-rw-r--r-- | tests/gem5/fixture.py | 94 |
1 files changed, 24 insertions, 70 deletions
diff --git a/tests/gem5/fixture.py b/tests/gem5/fixture.py index b04a334b0..e84b89f69 100644 --- a/tests/gem5/fixture.py +++ b/tests/gem5/fixture.py @@ -43,7 +43,7 @@ import tempfile import shutil import threading -from testlib.fixture import Fixture, globalfixture +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 @@ -112,7 +112,7 @@ class UniqueFixture(Fixture): self._setup(testitem) -class SConsFixture(Fixture): +class SConsFixture(UniqueFixture): ''' Fixture will wait until all SCons targets are collected and tests are about to be ran, then will invocate a single instance of SCons for all @@ -121,21 +121,18 @@ class SConsFixture(Fixture): :param directory: The directory which scons will -C (cd) into before executing. If None is provided, will choose the config base_dir. ''' - def __init__(self, directory=None, target_class=None, options=[]): - self.directory = directory if directory else config.base_dir - self.target_class = target_class if target_class else SConsTarget - self.threads = config.threads - self.targets = set() - self.options = options - super(SConsFixture, self).__init__() - def setup(self, testitem): + def __new__(cls, target): + obj = super(SConsFixture, cls).__new__(cls, target) + return obj + + def _setup(self, testitem): if config.skip_build: return command = [ 'scons', '-C', self.directory, - '-j', str(self.threads), + '-j', str(config.threads), '--ignore-style' ] @@ -159,70 +156,27 @@ class SConsFixture(Fixture): command.extend(self.options) log_call(log.test_log, command) - -class SConsTarget(Fixture): - # The singleton scons fixture we'll use for all targets. - default_scons_invocation = None - - def __init__(self, target, build_dir=None, invocation=None): - ''' - Represents a target to be built by an 'invocation' of scons. - - :param target: The target known to scons. - - :param build_dir: The 'build' directory path which will be prepended - to the target name. - - :param invocation: Represents an invocation of scons which we will - automatically attach this target to. If None provided, uses the - main 'scons' invocation. - ''' - - if build_dir is None: - build_dir = config.build_dir - self.target = os.path.join(build_dir, target) - super(SConsTarget, self).__init__(name=target) - - if invocation is None: - if self.default_scons_invocation is None: - SConsTarget.default_scons_invocation = SConsFixture() - globalfixture(SConsTarget.default_scons_invocation) - - invocation = self.default_scons_invocation - self.invocation = invocation - - def schedule_finalized(self, schedule): - self.invocation.targets.add(self.target) - return Fixture.schedule_finalized(self, schedule) - -class Gem5Fixture(SConsTarget): - other_invocations = {} # stores scons invocations other than the default - - def __init__(self, isa, variant, protocol=None): +class Gem5Fixture(SConsFixture): + def __new__(cls, isa, variant, protocol=None): + target_dir = joinpath(config.build_dir, isa.upper()) if protocol: - # When specifying an non-default protocol, we have to make a - # separate scons invocation with specific parameters. However, if - # more than one tests needs the same target, we need to make sure - # that we don't call scons too many times. - target_dir = isa.upper()+'-'+protocol - target = joinpath(target_dir, 'gem5.%s' % variant) - if target_dir in self.other_invocations.keys(): - invocation = self.other_invocations[target_dir] - else: - options = ['PROTOCOL='+protocol, '--default='+isa.upper()] - invocation = SConsFixture(options=options) - globalfixture(invocation) - Gem5Fixture.other_invocations[target_dir] = invocation - else: - target = joinpath(isa.upper(), 'gem5.%s' % variant) - invocation = None # use default - super(Gem5Fixture, self).__init__(target, invocation=invocation) + target_dir += '_' + protocol + target = joinpath(target_dir, 'gem5.%s' % variant) + obj = super(Gem5Fixture, cls).__new__(cls, target) + return obj + def _init(self, isa, variant, protocol=None): self.name = constants.gem5_binary_fixture_name + + self.targets = [self.target] self.path = self.target - self.isa = isa - self.variant = variant + self.directory = config.base_dir + self.options = [] + if protocol: + self.options = [ '--default=' + isa.upper(), + 'PROTOCOL=' + protocol ] + self.set_global() class MakeFixture(Fixture): def __init__(self, directory, *args, **kwargs): |