def test_execution_limit_in_threads(self): """Test two threads with different timeouts same time.""" # pydocstyle: ignore # conflict with black # noqa: E800 def make_test_function(slow_function_time, timeout): assert timeout < slow_function_time with timeit_context() as timeit_result: with pytest.raises(TimeoutException): with self.EXEC_TIMEOUT_CLASS(timeout) as exec_limit: self.slow_function(slow_function_time) assert exec_limit.is_cancelled_by_timeout() assert (timeit_result.time_passed >= timeout and timeit_result.time_passed < slow_function_time) t1_sleep, t1_timeout = 1, 0.6 t2_sleep, t2_timeout = 0.45, 0.1 t1 = Thread(target=partial(make_test_function, t1_sleep, t1_timeout)) t2 = Thread(target=partial(make_test_function, t2_sleep, t2_timeout)) with timeit_context() as time_t1: t1.start() with timeit_context() as time_t2: t2.start() t2.join() t1.join() assert t2_timeout <= time_t2.time_passed <= t2_sleep assert t1_timeout <= time_t1.time_passed < t1_sleep
def _measure( self, process: multiprocessing.Process ) -> Tuple[float, List[ResourceStats], bool]: """ Measure resources consumed by the process. :param process: process to measure resource consumption :return: time used, list of resource stats, was killed """ started_time = time.time() is_killed = False proc_info = psutil.Process(process.pid) stats = [] with timeit_context() as timeit: while process.is_alive(): if time.time() - started_time > self.timeout: is_killed = True break stats.append(self._get_stats_record(proc_info)) time.sleep(self.period) if is_killed: process.terminate() process.join() time_usage = timeit.time_passed return time_usage, stats, is_killed
def make_test_function(slow_function_time, timeout): assert timeout < slow_function_time with timeit_context() as timeit_result: with pytest.raises(TimeoutException): with self.EXEC_TIMEOUT_CLASS(timeout) as exec_limit: self.slow_function(slow_function_time) assert exec_limit.is_cancelled_by_timeout() assert (timeit_result.time_passed >= timeout and timeit_result.time_passed < slow_function_time)
def test_limit_is_0_do_not_limit_execution(self): """Test function will not be interrupted cause timeout is 0 or None.""" slow_function_time = 0.1 timeout = 0 assert timeout < slow_function_time with timeit_context() as timeit_result: with self.EXEC_TIMEOUT_CLASS(timeout) as exec_timeout: self.slow_function(slow_function_time) assert not exec_timeout.is_cancelled_by_timeout() assert timeit_result.time_passed >= slow_function_time
def test_timeout_bigger_than_execution_time(self): """Test function interrupted by timeout.""" slow_function_time = 0.1 timeout = 1 assert timeout > slow_function_time with timeit_context() as timeit_result: with self.EXEC_TIMEOUT_CLASS(timeout) as exec_timeout: self.slow_function(slow_function_time) assert not exec_timeout.is_cancelled_by_timeout() assert (timeit_result.time_passed <= timeout and timeit_result.time_passed >= slow_function_time)
def test_cancel_by_timeout(self): """Test function interrupted by timeout.""" slow_function_time = 0.4 timeout = 0.1 assert timeout < slow_function_time with timeit_context() as timeit_result: with pytest.raises(TimeoutException): with self.EXEC_TIMEOUT_CLASS(timeout) as exec_timeout: self.slow_function(slow_function_time) assert exec_timeout.is_cancelled_by_timeout() assert (timeit_result.time_passed >= timeout and timeit_result.time_passed < slow_function_time)
def test_no_timeout(self): """Test function NOT terminated by timeout cause timeout == 0.""" num_sleeps = 1 sleep_time = self.BASE_TIMEOUT function_sleep_time = num_sleeps * sleep_time execution_timeout = 0 self.prepare(lambda: sleep_a_bit(sleep_time, num_sleeps)) self.aea_tool.set_execution_timeout(execution_timeout) self.aea_tool.setup() with timeit_context() as timeit: self.aea_action() assert function_sleep_time <= timeit.time_passed assert self.function_finished
def test_long_handler_cancelled_by_timeout(self): """Test long function terminated by timeout.""" num_sleeps = 10 sleep_time = self.BASE_TIMEOUT function_sleep_time = num_sleeps * sleep_time execution_timeout = self.BASE_TIMEOUT * 2 assert execution_timeout < function_sleep_time self.prepare(lambda: sleep_a_bit(sleep_time, num_sleeps)) self.aea_tool.set_execution_timeout(execution_timeout) with timeit_context() as timeit: self.aea_action() assert execution_timeout <= timeit.time_passed <= function_sleep_time assert not self.function_finished
def test_short_handler_not_cancelled_by_timeout(self): """Test short function NOT terminated by timeout.""" num_sleeps = 1 sleep_time = self.BASE_TIMEOUT function_sleep_time = num_sleeps * sleep_time execution_timeout = self.BASE_TIMEOUT * 2 assert function_sleep_time <= execution_timeout self.prepare(lambda: sleep_a_bit(sleep_time, num_sleeps)) self.aea_tool.set_execution_timeout(execution_timeout) self.aea_tool.setup() with timeit_context() as timeit: self.aea_action() assert function_sleep_time <= timeit.time_passed <= execution_timeout assert self.function_finished