Fix stopping timer in TestTimer

Fixes broken functional tests where NamespaceFixture is used and
the TestTimer raises TestTimerTimeout even if the namespace was cleaned
up in time.

The fix makes sure that the alarm is cancelled in __exit__ if there
was no alarm before TestTimer's __enter__ (if self._old_timer is 0).
It also makes sure to reset the signal handler if the old one was
Handler.SIG_DFL (which is treated as false, no we need to check for
"is not None" instead).

Closes-Bug: #1912320
Change-Id: I9efad8eb5fe6e794235280f8a9a026800513d969
This commit is contained in:
Bodo Petermann 2021-01-19 13:25:24 +01:00
parent d1d8c0f738
commit 9676c28f9c
1 changed files with 7 additions and 6 deletions

View File

@ -263,15 +263,16 @@ class TestTimer(object):
return self
def __exit__(self, exc, value, traceback):
if self._old_handler:
if self._old_handler is not None:
signal.signal(signal.SIGALRM, self._old_handler)
if self._old_timer == 0:
return
timeout = 0
else:
# If timer has expired, set the minimum required value (1) to
# activate the SIGALRM event.
timeout = self._old_timer - self._timeout
timeout = 1 if timeout <= 0 else timeout
# If timer has expired, set the minimum required value (1) to activate
# the SIGALRM event.
timeout = self._old_timer - self._timeout
timeout = 1 if timeout <= 0 else timeout
if self._alarm_fn:
self._alarm_fn(timeout)