1# Copyright (C) 2016 Intel Corporation
2# Released under the MIT license (see COPYING.MIT)
3
4import signal
5from . import OETestDecorator, registerDecorator
6from oeqa.core.exception import OEQATimeoutError
7
8@registerDecorator
9class OETimeout(OETestDecorator):
10    attrs = ('oetimeout',)
11
12    def setUpDecorator(self):
13        timeout = self.oetimeout
14        def _timeoutHandler(signum, frame):
15            raise OEQATimeoutError("Timed out after %s "
16                    "seconds of execution" % timeout)
17
18        self.logger.debug("Setting up a %d second(s) timeout" % self.oetimeout)
19        self.alarmSignal = signal.signal(signal.SIGALRM, _timeoutHandler)
20        signal.alarm(self.oetimeout)
21
22    def tearDownDecorator(self):
23        signal.alarm(0)
24        signal.signal(signal.SIGALRM, self.alarmSignal)
25        self.logger.debug("Removed SIGALRM handler")
26