From 8282b7408b68187155e8109ba4dd267f5bac2c94 Mon Sep 17 00:00:00 2001 From: Nikos Nikoleris Date: Tue, 18 Jun 2019 11:50:24 +0100 Subject: 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 Reviewed-by: Giacomo Travaglini Maintainer: Giacomo Travaglini --- tests/gem5/fixture.py | 94 +++++++++++++-------------------------------------- 1 file changed, 24 insertions(+), 70 deletions(-) (limited to 'tests') 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): -- cgit v1.2.3