diff options
| author | Adrian Prantl <aprantl@apple.com> | 2018-02-06 18:22:51 +0000 |
|---|---|---|
| committer | Adrian Prantl <aprantl@apple.com> | 2018-02-06 18:22:51 +0000 |
| commit | 332351d9b98f993e4d0eb83a98ff4d4bb619b541 (patch) | |
| tree | 342ad2040a651b28809035213b74aa0719f4910b /lldb/packages/Python/lldbsuite/test/lldbtest.py | |
| parent | 2f6412c38962193f085f7830fd54e693579a35d2 (diff) | |
| download | llvm-332351d9b98f993e4d0eb83a98ff4d4bb619b541.zip llvm-332351d9b98f993e4d0eb83a98ff4d4bb619b541.tar.gz llvm-332351d9b98f993e4d0eb83a98ff4d4bb619b541.tar.bz2 | |
Build each testcase variant in its own subdirectory and remove the srcdir lock file
This patch creates a <test>.dwarf, <test>.dwo, etc., build directory for each testcase variant.
Most importantly, this eliminates the need for the per-test lock file in the source directory.
Tests that are marked as NO_DEBUG_INFO_TESTCASE and build with
buildDefault() are built in a <test>.default build directory.
Differential Revision: https://reviews.llvm.org/D42763
llvm-svn: 324368
Diffstat (limited to 'lldb/packages/Python/lldbsuite/test/lldbtest.py')
| -rw-r--r-- | lldb/packages/Python/lldbsuite/test/lldbtest.py | 105 |
1 files changed, 42 insertions, 63 deletions
diff --git a/lldb/packages/Python/lldbsuite/test/lldbtest.py b/lldb/packages/Python/lldbsuite/test/lldbtest.py index ce1acca..e202dc2 100644 --- a/lldb/packages/Python/lldbsuite/test/lldbtest.py +++ b/lldb/packages/Python/lldbsuite/test/lldbtest.py @@ -523,11 +523,14 @@ class Base(unittest2.TestCase): @staticmethod def compute_mydir(test_file): - '''Subclasses should call this function to correctly calculate the required "mydir" attribute as follows: + '''Subclasses should call this function to correctly calculate the + required "mydir" attribute as follows: - mydir = TestBase.compute_mydir(__file__)''' - test_dir = os.path.dirname(test_file) - return test_dir[len(os.environ["LLDB_TEST"]) + 1:] + mydir = TestBase.compute_mydir(__file__) + ''' + # /abs/path/to/packages/group/subdir/mytest.py -> group/subdir + rel_prefix = test_file[len(os.environ["LLDB_TEST"]) + 1:] + return os.path.dirname(rel_prefix) def TraceOn(self): """Returns True if we are in trace mode (tracing detailed test execution).""" @@ -549,32 +552,11 @@ class Base(unittest2.TestCase): # Change current working directory if ${LLDB_TEST} is defined. # See also dotest.py which sets up ${LLDB_TEST}. if ("LLDB_TEST" in os.environ): - full_dir = os.path.join(os.environ["LLDB_TEST"], cls.mydir) + full_dir = os.path.join(os.environ["LLDB_TEST"], + cls.mydir) if traceAlways: print("Change dir to:", full_dir, file=sys.stderr) - os.chdir(os.path.join(os.environ["LLDB_TEST"], cls.mydir)) - - # TODO: Obsolete this by creating one working dir per configuration. - if debug_confirm_directory_exclusivity: - import lock - cls.dir_lock = lock.Lock(os.path.join(full_dir, ".dirlock")) - try: - cls.dir_lock.try_acquire() - # write the class that owns the lock into the lock file - cls.dir_lock.handle.write(cls.__name__) - except IOError as ioerror: - # nothing else should have this directory lock - # wait here until we get a lock - cls.dir_lock.acquire() - # read the previous owner from the lock file - lock_id = cls.dir_lock.handle.read() - print( - "LOCK ERROR: {} wants to lock '{}' but it is already locked by '{}'".format( - cls.__name__, - full_dir, - lock_id), - file=sys.stderr) - raise ioerror + os.chdir(full_dir) # Set platform context. cls.platformContext = lldbplatformutil.createPlatformContext() @@ -725,14 +707,17 @@ class Base(unittest2.TestCase): def getBuildDir(self): """Return the full path to the current test.""" - return os.path.join(os.environ["LLDB_BUILD"], self.mydir) + variant = self.getDebugInfo() + if variant is None: + variant = 'default' + return os.path.join(os.environ["LLDB_BUILD"], self.mydir, + self.testMethodName) def makeBuildDir(self): """Create the test-specific working directory.""" # See also dotest.py which sets up ${LLDB_BUILD}. - try: os.makedirs(self.getBuildDir()) - except: pass + lldbutil.mkdir_p(self.getBuildDir()) def getBuildArtifact(self, name="a.out"): """Return absolute path to an artifact in the test's build directory.""" @@ -1516,18 +1501,17 @@ class Base(unittest2.TestCase): architecture=None, compiler=None, dictionary=None, - clean=True, - testdir=None): + clean=True): """Platform specific way to build the default binaries.""" - if not testdir: - testdir = self.mydir + testdir = self.mydir + testname = self.testMethodName if self.getDebugInfo(): raise Exception("buildDefault tests must set NO_DEBUG_INFO_TESTCASE") module = builder_module() self.makeBuildDir() dictionary = lldbplatformutil.finalize_build_dictionary(dictionary) if not module.buildDefault(self, architecture, compiler, - dictionary, clean, testdir): + dictionary, clean, testdir, testname): raise Exception("Don't know how to build default binary") def buildDsym( @@ -1535,18 +1519,17 @@ class Base(unittest2.TestCase): architecture=None, compiler=None, dictionary=None, - clean=True, - testdir=None): + clean=True): """Platform specific way to build binaries with dsym info.""" - if not testdir: - testdir = self.mydir + testdir = self.mydir + testname = self.testMethodName if self.getDebugInfo() != "dsym": raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault") module = builder_module() dictionary = lldbplatformutil.finalize_build_dictionary(dictionary) if not module.buildDsym(self, architecture, compiler, - dictionary, clean, testdir): + dictionary, clean, testdir, testname): raise Exception("Don't know how to build binary with dsym") def buildDwarf( @@ -1554,18 +1537,17 @@ class Base(unittest2.TestCase): architecture=None, compiler=None, dictionary=None, - clean=True, - testdir=None): + clean=True): """Platform specific way to build binaries with dwarf maps.""" - if not testdir: - testdir = self.mydir + testdir = self.mydir + testname = self.testMethodName if self.getDebugInfo() != "dwarf": raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault") module = builder_module() dictionary = lldbplatformutil.finalize_build_dictionary(dictionary) if not module.buildDwarf(self, architecture, compiler, - dictionary, clean, testdir): + dictionary, clean, testdir, testname): raise Exception("Don't know how to build binary with dwarf") def buildDwo( @@ -1573,18 +1555,17 @@ class Base(unittest2.TestCase): architecture=None, compiler=None, dictionary=None, - clean=True, - testdir=None): + clean=True): """Platform specific way to build binaries with dwarf maps.""" - if not testdir: - testdir = self.mydir + testdir = self.mydir + testname = self.testMethodName if self.getDebugInfo() != "dwo": raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault") module = builder_module() dictionary = lldbplatformutil.finalize_build_dictionary(dictionary) if not module.buildDwo(self, architecture, compiler, - dictionary, clean, testdir): + dictionary, clean, testdir, testname): raise Exception("Don't know how to build binary with dwo") def buildGModules( @@ -1592,18 +1573,17 @@ class Base(unittest2.TestCase): architecture=None, compiler=None, dictionary=None, - clean=True, - testdir=None): + clean=True): """Platform specific way to build binaries with gmodules info.""" - if not testdir: - testdir = self.mydir + testdir = self.mydir + testname = self.testMethodName if self.getDebugInfo() != "gmodules": raise Exception("NO_DEBUG_INFO_TESTCASE must build with buildDefault") module = builder_module() dictionary = lldbplatformutil.finalize_build_dictionary(dictionary) if not module.buildGModules(self, architecture, compiler, - dictionary, clean, testdir): + dictionary, clean, testdir, testname): raise Exception("Don't know how to build binary with gmodules") def buildGo(self): @@ -1778,6 +1758,7 @@ class LLDBTestCaseFactory(type): supported_categories = [ x for x in categories if test_categories.is_supported_on_platform( x, target_platform, configuration.compiler)] + if "dsym" in supported_categories: @decorators.add_test_categories(["dsym"]) @wraps(attrvalue) @@ -2322,19 +2303,17 @@ class TestBase(Base): dictionary = lldbplatformutil.finalize_build_dictionary(dictionary) if self.getDebugInfo() is None: return self.buildDefault(architecture, compiler, dictionary, - clean, self.mydir) + clean) elif self.getDebugInfo() == "dsym": - return self.buildDsym(architecture, compiler, dictionary, - clean, self.mydir) + return self.buildDsym(architecture, compiler, dictionary, clean) elif self.getDebugInfo() == "dwarf": - return self.buildDwarf(architecture, compiler, dictionary, - clean, self.mydir) + return self.buildDwarf(architecture, compiler, dictionary, clean) elif self.getDebugInfo() == "dwo": return self.buildDwo(architecture, compiler, dictionary, - clean, self.mydir) + clean) elif self.getDebugInfo() == "gmodules": return self.buildGModules(architecture, compiler, dictionary, - clean, self.mydir) + clean) else: self.fail("Can't build for debug info: %s" % self.getDebugInfo()) |
