def test_create_environment(self): options = parse_options(args=[ "--host", "https://custom-host", "--reset-stats", ]) env = create_environment([], options) self.assertEqual("https://custom-host", env.host) self.assertTrue(env.reset_stats) options = parse_options(args=[]) env = create_environment([], options) self.assertEqual(None, env.host) self.assertFalse(env.reset_stats)
def test_stop_timeout_with_interrupt_no_reschedule(self): state = [0] class MySubTaskSet(TaskSet): @task def a_task(self): gevent.sleep(0.1) state[0] = 1 self.interrupt(reschedule=False) class MyTestUser(User): tasks = [MySubTaskSet] wait_time = constant(3) environment = create_environment([MyTestUser], mocked_options()) environment.stop_timeout = 0.3 runner = environment.create_local_runner() runner.start(1, 1, wait=True) gevent.sleep(0) timeout = gevent.Timeout(0.11) timeout.start() try: runner.quit() runner.greenlet.join() except gevent.Timeout: self.fail( "Got Timeout exception. Interrupted locusts should exit immediately during stop_timeout." ) finally: timeout.cancel() self.assertEqual(1, state[0])
def test_stop_timeout_during_on_start(self): short_time = 0.05 class MyTaskSet(TaskSet): finished_on_start = False my_task_run = False def on_start(self): gevent.sleep(short_time) MyTaskSet.finished_on_start = True @task def my_task(self): MyTaskSet.my_task_run = True class MyTestUser(User): tasks = [MyTaskSet] wait_time = constant(0) environment = create_environment([MyTestUser], mocked_options()) environment.stop_timeout = short_time runner = environment.create_local_runner() runner.start(1, 1) gevent.sleep(short_time / 2) runner.quit() self.assertTrue(MyTaskSet.finished_on_start) self.assertFalse(MyTaskSet.my_task_run)
def test_stop_timeout_with_interrupt(self): short_time = 0.05 class MySubTaskSet(TaskSet): @task def a_task(self): gevent.sleep(0) self.interrupt(reschedule=True) class MyTaskSet(TaskSet): tasks = [MySubTaskSet] class MyTestLocust(Locust): tasks = [MyTaskSet] wait_time = constant(0) environment = create_environment(mocked_options()) environment.stop_timeout = short_time runner = LocalLocustRunner(environment, [MyTestLocust]) runner.start(1, 1, wait=True) gevent.sleep(0) timeout = gevent.Timeout(short_time) timeout.start() try: runner.quit() runner.greenlet.join() except gevent.Timeout: self.fail( "Got Timeout exception. Interrupted locusts should exit immediately during stop_timeout." ) finally: timeout.cancel()
def test_stop_timeout_during_on_start(self): short_time = 0.05 class MyTaskSet(TaskSet): finished_on_start = False my_task_run = False def on_start(self): gevent.sleep(short_time) MyTaskSet.finished_on_start = True @task def my_task(self): MyTaskSet.my_task_run = True class MyTestLocust(Locust): task_set = MyTaskSet wait_time = constant(0) environment = create_environment(mocked_options()) environment.stop_timeout = short_time runner = LocalLocustRunner(environment, [MyTestLocust]) runner.start(1, 1) gevent.sleep(short_time / 2) runner.quit() self.assertTrue(MyTaskSet.finished_on_start) self.assertFalse(MyTaskSet.my_task_run)
def test_kill_locusts_with_stop_timeout(self): short_time = 0.05 class MyTaskSet(TaskSet): @task def my_task(self): MyTaskSet.state = "first" gevent.sleep(short_time) MyTaskSet.state = "second" # should only run when run time + stop_timeout is > short_time gevent.sleep(short_time) MyTaskSet.state = "third" # should only run when run time + stop_timeout is > short_time * 2 class MyTestUser(User): tasks = [MyTaskSet] wait_time = constant(0) environment = create_environment([MyTestUser], mocked_options()) runner = environment.create_local_runner() runner.start(1, 1) gevent.sleep(short_time / 2) runner.stop_users(1) self.assertEqual("first", MyTaskSet.state) runner.quit() environment.runner = None environment.stop_timeout = short_time / 2 # exit with timeout runner = environment.create_local_runner() runner.start(1, 1) gevent.sleep(short_time) runner.stop_users(1) self.assertEqual("second", MyTaskSet.state) runner.quit() environment.runner = None environment.stop_timeout = short_time * 3 # allow task iteration to complete, with some margin runner = environment.create_local_runner() runner.start(1, 1) gevent.sleep(short_time) timeout = gevent.Timeout(short_time * 2) timeout.start() try: runner.stop_users(1) runner.user_greenlets.join() except gevent.Timeout: self.fail( "Got Timeout exception. Some locusts must have kept runnining after iteration finish" ) finally: timeout.cancel() self.assertEqual("third", MyTaskSet.state)