oeqa/selftest: Clean up separate builddir in success case when non-threaded

If oe-selftest is run without -j, the separate build directory "build-st"
isn't cleaned up afterwards. Mirror the behaviour of the -j option to
handle this the same way, only preserve upon failure.

To do this, the remove function needs to be moved to the selftest
context module so that it can be accessed without requiring the
testtools and subunit modules the -j option requires.

A dummy wrapper class is used to wrap the tests and clean up afterwards.

[YOCTO #13953]

(From OE-Core rev: 20e7b1eeeb12f1cf4bd9934e0a5733c6bbe64372)

Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit 1b376ade430d40d3cfe9c18f200c764d622710e5)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Richard Purdie
2020-06-27 13:42:00 +01:00
parent a225c162e6
commit 3d815d7227
2 changed files with 37 additions and 22 deletions

View File

@@ -183,10 +183,11 @@ class dummybuf(object):
#
class ConcurrentTestSuite(unittest.TestSuite):
def __init__(self, suite, processes, setupfunc):
def __init__(self, suite, processes, setupfunc, removefunc):
super(ConcurrentTestSuite, self).__init__([suite])
self.processes = processes
self.setupfunc = setupfunc
self.removefunc = removefunc
def run(self, result):
tests, totaltests = fork_for_tests(self.processes, self)
@@ -237,22 +238,6 @@ class ConcurrentTestSuite(unittest.TestSuite):
finally:
queue.put(test)
def removebuilddir(d):
delay = 5
while delay and os.path.exists(d + "/bitbake.lock"):
time.sleep(1)
delay = delay - 1
# Deleting these directories takes a lot of time, use autobuilder
# clobberdir if its available
clobberdir = os.path.expanduser("~/yocto-autobuilder-helper/janitor/clobberdir")
if os.path.exists(clobberdir):
try:
subprocess.check_call([clobberdir, d])
return
except subprocess.CalledProcessError:
pass
bb.utils.prunedir(d, ionice=True)
def fork_for_tests(concurrency_num, suite):
result = []
if 'BUILDDIR' in os.environ:
@@ -297,7 +282,7 @@ def fork_for_tests(concurrency_num, suite):
if ourpid != os.getpid():
os._exit(0)
if newbuilddir and unittest_result.wasSuccessful():
removebuilddir(newbuilddir)
suite.removefunc(newbuilddir)
except:
# Don't do anything with process children
if ourpid != os.getpid():
@@ -313,7 +298,7 @@ def fork_for_tests(concurrency_num, suite):
sys.stderr.write(traceback.format_exc())
finally:
if newbuilddir:
removebuilddir(newbuilddir)
suite.removefunc(newbuilddir)
stream.flush()
os._exit(1)
stream.flush()

View File

@@ -22,6 +22,37 @@ from oeqa.core.exception import OEQAPreRun, OEQATestNotFound
from oeqa.utils.commands import runCmd, get_bb_vars, get_test_layer
class NonConcurrentTestSuite(unittest.TestSuite):
def __init__(self, suite, processes, setupfunc, removefunc):
super().__init__([suite])
self.processes = processes
self.suite = suite
self.setupfunc = setupfunc
self.removefunc = removefunc
def run(self, result):
(builddir, newbuilddir) = self.setupfunc("-st", None, self.suite)
ret = super().run(result)
os.chdir(builddir)
if newbuilddir and ret.wasSuccessful():
self.removefunc(newbuilddir)
def removebuilddir(d):
delay = 5
while delay and os.path.exists(d + "/bitbake.lock"):
time.sleep(1)
delay = delay - 1
# Deleting these directories takes a lot of time, use autobuilder
# clobberdir if its available
clobberdir = os.path.expanduser("~/yocto-autobuilder-helper/janitor/clobberdir")
if os.path.exists(clobberdir):
try:
subprocess.check_call([clobberdir, d])
return
except subprocess.CalledProcessError:
pass
bb.utils.prunedir(d, ionice=True)
class OESelftestTestContext(OETestContext):
def __init__(self, td=None, logger=None, machines=None, config_paths=None, newbuilddir=None):
super(OESelftestTestContext, self).__init__(td, logger)
@@ -86,10 +117,9 @@ class OESelftestTestContext(OETestContext):
if processes:
from oeqa.core.utils.concurrencytest import ConcurrentTestSuite
return ConcurrentTestSuite(suites, processes, self.setup_builddir)
return ConcurrentTestSuite(suites, processes, self.setup_builddir, removebuilddir)
else:
self.setup_builddir("-st", None, suites)
return suites
return NonConcurrentTestSuite(suites, processes, self.setup_builddir, removebuilddir)
def runTests(self, processes=None, machine=None, skips=[]):
if machine: