oeqa: tear down oeqa decorators if one of them raises an exception in setup

Some of the decorators need proper cleanup, such as OETimeout
which sets a signal handler that needs to be cleared via teardown.
If this is not done then the signal gets called later with unpredictable effects.

This can be seen if there's a test that is skipped via a decorator and sets a timeout
at the same time: the timeout isn't cleared, and is invoked later in a
completely unrelated context. The test case for this is added in the
next commit.

(From OE-Core rev: be45a8271c06ffbb5d97afd33bb15b1143b6cf8d)

Signed-off-by: Alexander Kanavin <alex.kanavin@gmail.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit f42a08e1aabf1ca57e0c09d69fb69cc717c7f156)
Signed-off-by: Anuj Mittal <anuj.mittal@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Alexander Kanavin 2021-04-20 19:32:58 +02:00 committed by Richard Purdie
parent 509dd69bad
commit 1ecf10dc33
2 changed files with 10 additions and 4 deletions

View File

@ -43,8 +43,13 @@ class OETestCase(unittest.TestCase):
clss.tearDownClassMethod()
def _oeSetUp(self):
for d in self.decorators:
d.setUpDecorator()
try:
for d in self.decorators:
d.setUpDecorator()
except:
for d in self.decorators:
d.tearDownDecorator()
raise
self.setUpMethod()
def _oeTearDown(self):

View File

@ -24,5 +24,6 @@ class OETimeout(OETestDecorator):
def tearDownDecorator(self):
signal.alarm(0)
signal.signal(signal.SIGALRM, self.alarmSignal)
self.logger.debug("Removed SIGALRM handler")
if hasattr(self, 'alarmSignal'):
signal.signal(signal.SIGALRM, self.alarmSignal)
self.logger.debug("Removed SIGALRM handler")