async def test_stop_allows_only_one_stop_process_to_run_concurrently( self, three_level_app_chain): with connection_manager() as conn: pipeline = BasePipeline(connection_name=conn.name, installed_apps=three_level_app_chain) # Mock all of the apps that have been configured for this pipeline. for key, app in pipeline._installed_apps.items(): app_mock = MagicMock(app.__class__) pipeline._installed_apps[key] = app_mock # Simulate all apps active pipeline._active_apps = OrderedDict(pipeline.apps.items()) asyncio.create_task(pipeline.stop()) asyncio.create_task(pipeline.stop()) asyncio.create_task(pipeline.stop()) await pipeline.stop() for app in pipeline.apps.values(): assert app.stop.call_count == 1 # Wait for separate tasks to complete tasks = asyncio.all_tasks() await asyncio.wait(tasks, timeout=0.1)
async def test_stop_stops_apps_in_top_down_order(self, three_level_app_chain): with connection_manager() as conn: pipeline = BasePipeline(connection_name=conn.name, installed_apps=three_level_app_chain) mock_parent = MagicMock() # Mock all of the apps that have been configured for this pipeline. for key, app in pipeline._installed_apps.items(): app_mock = MagicMock(app.__class__) app_mock.name = app.name setattr(mock_parent, app.name, app_mock) pipeline._installed_apps[key] = app_mock # Simulate all apps active pipeline._active_apps = OrderedDict(pipeline.apps.items()) await pipeline.stop() for app in pipeline.apps.values(): assert app.stop.called assert app.stop.call_count == 1 call_order = [ call[0].rstrip("stop").rstrip(".") for call in mock_parent.method_calls[-len(pipeline.apps):] ] assert call_order == list(pipeline.apps.keys())
async def test_send_stop(self, three_level_stop_app_chain): with connection_manager() as conn: pipeline = BasePipeline(connection_name=conn.name, installed_apps=three_level_stop_app_chain) # Simulate all apps active pipeline._active_apps = OrderedDict(pipeline.apps.items()) message = await pipeline.send(admin.TestRequestMessage("Test")) assert message.TestReqID == "Test s3"
def test_prep_processing_pipeline_inbound_order(self, three_level_app_chain): with connection_manager() as conn: pipeline = BasePipeline(connection_name=conn.name, installed_apps=three_level_app_chain) # Simulate all apps active pipeline._active_apps = OrderedDict(pipeline.apps.items()) func, app_chain = pipeline._setup_message_handling( pipeline.INBOUND_PROCESSING) assert func == "on_receive" assert next(app_chain).name == "below" assert next(app_chain).name == "middle" assert next(app_chain).name == "top"
async def test_stop_no_op_if_already_stopped(self, three_level_app_chain): with connection_manager() as conn: pipeline = BasePipeline(connection_name=conn.name, installed_apps=three_level_app_chain) # Mock all of the apps that have been configured for this pipeline. for key, app in pipeline._installed_apps.items(): app_mock = MagicMock(app.__class__) pipeline._installed_apps[key] = app_mock # Simulate all apps active pipeline._active_apps = OrderedDict(pipeline.apps.items()) await pipeline.stop() await pipeline.stop() for app in pipeline.apps.values(): assert app.stop.called assert app.stop.call_count == 1