class AppWorkerHelper(object): implements(IHelper) def __init__(self, worker_class, **msg_helper_args): self._worker_class = worker_class self.vumi_helper = VumiApiHelper() self._app_helper = ApplicationHelper(self._conversation_type(), self.vumi_helper) self.msg_helper = GoMessageHelper(**msg_helper_args) self.transport_name = self.msg_helper.transport_name self.worker_helper = self.vumi_helper.get_worker_helper( self.transport_name) self.dispatch_helper = MessageDispatchHelper(self.msg_helper, self.worker_helper) # Proxy methods from our helpers. generate_proxies(self, self._app_helper) generate_proxies(self, self.msg_helper) generate_proxies(self, self.worker_helper) generate_proxies(self, self.dispatch_helper) def _worker_name(self): return self._worker_class.worker_name def _conversation_type(self): # This is a guess based on worker_name. # TODO: We need a better way to do this, probably involving either the # conversation definition or go.config. return self._worker_name().rpartition('_')[0].decode('utf-8') def setup(self): return self.vumi_helper.setup(setup_vumi_api=False) def cleanup(self): return self.vumi_helper.cleanup() @inlineCallbacks def get_app_worker(self, config=None, start=True): # Note: We assume that this is called exactly once per test. config = self.vumi_helper.mk_config(config or {}) config.setdefault('worker_name', self._worker_name()) config.setdefault('transport_name', self.msg_helper.transport_name) worker = yield self.get_worker(self._worker_class, config, start) # Set up our other bits of helper. self.vumi_helper.set_vumi_api(worker.vumi_api) self.msg_helper.mdb = worker.vumi_api.mdb returnValue(worker) @inlineCallbacks def start_conversation(self, conversation): assert self._get_pending_commands() == [], ( "Found pending commands while starting conversation, aborting.") yield conversation.start() yield self.dispatch_commands_to_app() @inlineCallbacks def stop_conversation(self, conversation): assert self._get_pending_commands() == [], ( "Found pending commands while stopping conversation, aborting.") yield conversation.stop_conversation() yield self.dispatch_commands_to_app() def _get_pending_commands(self): return self.worker_helper.get_dispatched('vumi', 'api', VumiApiCommand) @inlineCallbacks def dispatch_commands_to_app(self): pending_commands = self._get_pending_commands() self.worker_helper._clear_dispatched('vumi', 'api') for command in pending_commands: yield self.worker_helper.dispatch_raw( "%s.control" % (self._worker_name(), ), command) @inlineCallbacks def dispatch_command(self, command, *args, **kw): cmd = VumiApiCommand.command(self._worker_name(), command, *args, **kw) yield self.worker_helper.dispatch_raw('vumi.api', cmd) yield self.dispatch_commands_to_app() def get_published_metrics(self, worker): metrics = [] for metric_msg in self.worker_helper.get_dispatched_metrics(): for name, _aggs, data in metric_msg: for _time, value in data: metrics.append((name, value)) return metrics def get_dispatched_app_events(self): return self.worker_helper.get_dispatched('vumi', 'event', VumiApiEvent)
class AppWorkerHelper(object): implements(IHelper) def __init__(self, worker_class, **msg_helper_args): self._worker_class = worker_class self.vumi_helper = VumiApiHelper() self._app_helper = ApplicationHelper( self._conversation_type(), self.vumi_helper) self.msg_helper = GoMessageHelper(**msg_helper_args) self.transport_name = self.msg_helper.transport_name self.worker_helper = self.vumi_helper.get_worker_helper( self.transport_name) self.dispatch_helper = MessageDispatchHelper( self.msg_helper, self.worker_helper) # Proxy methods from our helpers. generate_proxies(self, self._app_helper) generate_proxies(self, self.msg_helper) generate_proxies(self, self.worker_helper) generate_proxies(self, self.dispatch_helper) def _worker_name(self): return self._worker_class.worker_name def _conversation_type(self): # This is a guess based on worker_name. # TODO: We need a better way to do this, probably involving either the # conversation definition or go.config. return self._worker_name().rpartition('_')[0].decode('utf-8') def setup(self): return self.vumi_helper.setup(setup_vumi_api=False) def cleanup(self): return self.vumi_helper.cleanup() @inlineCallbacks def get_app_worker(self, config=None, start=True): # Note: We assume that this is called exactly once per test. config = self.vumi_helper.mk_config(config or {}) config.setdefault('worker_name', self._worker_name()) config.setdefault('transport_name', self.msg_helper.transport_name) worker = yield self.get_worker(self._worker_class, config, start) # Set up our other bits of helper. self.vumi_helper.set_vumi_api(worker.vumi_api) self.msg_helper.mdb = worker.vumi_api.mdb returnValue(worker) @inlineCallbacks def start_conversation(self, conversation): assert self._get_pending_commands() == [], ( "Found pending commands while starting conversation, aborting.") yield conversation.start() yield self.dispatch_commands_to_app() @inlineCallbacks def stop_conversation(self, conversation): assert self._get_pending_commands() == [], ( "Found pending commands while stopping conversation, aborting.") yield conversation.stop_conversation() yield self.dispatch_commands_to_app() def _get_pending_commands(self): return self.worker_helper.get_dispatched('vumi', 'api', VumiApiCommand) @inlineCallbacks def dispatch_commands_to_app(self): pending_commands = self._get_pending_commands() self.worker_helper._clear_dispatched('vumi', 'api') for command in pending_commands: yield self.worker_helper.dispatch_raw( "%s.control" % (self._worker_name(),), command) @inlineCallbacks def dispatch_command(self, command, *args, **kw): cmd = VumiApiCommand.command( self._worker_name(), command, *args, **kw) yield self.worker_helper.dispatch_raw('vumi.api', cmd) yield self.dispatch_commands_to_app() def get_published_metrics(self, worker): metrics = [] for metric_msg in self.worker_helper.get_dispatched_metrics(): for name, _aggs, data in metric_msg: for _time, value in data: metrics.append((name, value)) return metrics def get_dispatched_app_events(self): return self.worker_helper.get_dispatched('vumi', 'event', VumiApiEvent)
class RouterWorkerHelper(object): implements(IHelper) def __init__(self, worker_class, **msg_helper_args): self._worker_class = worker_class msg_helper_kw = {} if msg_helper_args is not None: msg_helper_kw.update(msg_helper_args) self.vumi_helper = VumiApiHelper() self._router_helper = RouterHelper( self._router_type(), self.vumi_helper) self.msg_helper = GoMessageHelper(**msg_helper_kw) # Proxy methods from our helpers. generate_proxies(self, self._router_helper) generate_proxies(self, self.msg_helper) self.ri = RouterConnectorHelper( 'ri_conn', self.vumi_helper, self.msg_helper) self.ro = RouterConnectorHelper( 'ro_conn', self.vumi_helper, self.msg_helper) def _worker_name(self): return self._worker_class.worker_name def _router_type(self): # This is a guess based on worker_name. # We need a better way to do this. return self._worker_name().rpartition('_')[0].decode('utf-8') def setup(self): self.vumi_helper.setup(setup_vumi_api=False) @inlineCallbacks def cleanup(self): yield self.ro.cleanup() yield self.ri.cleanup() yield self.msg_helper.cleanup() yield self.vumi_helper.cleanup() @inlineCallbacks def get_router_worker(self, config=None, start=True): # Note: We assume that this is called exactly once per test. config = self.vumi_helper.mk_config(config or {}) config.setdefault('worker_name', self._worker_name()) config.setdefault('ri_connector_name', self.ri.connector_name) config.setdefault('ro_connector_name', self.ro.connector_name) worker = yield self.ri.get_worker(self._worker_class, config, start) # Set up our other bits of helper. self.vumi_helper.set_vumi_api(worker.vumi_api) self.msg_helper.mdb = worker.vumi_api.mdb returnValue(worker) @inlineCallbacks def start_router(self, router): assert self._get_pending_commands() == [], ( "Found pending commands while starting router, aborting.") user_helper = yield self.vumi_helper.get_or_create_user() router_api = user_helper.user_api.get_router_api( router.router_type, router.key) yield router_api.start_router(router) yield self.dispatch_commands_to_router() @inlineCallbacks def stop_router(self, router): assert self._get_pending_commands() == [], ( "Found pending commands while stopping router, aborting.") user_helper = yield self.vumi_helper.get_or_create_user() router_api = user_helper.user_api.get_router_api( router.router_type, router.key) yield router_api.stop_router(router) yield self.dispatch_commands_to_router() def _get_pending_commands(self): return self.ri.get_dispatched('vumi', 'api', VumiApiCommand) @inlineCallbacks def dispatch_commands_to_router(self): pending_commands = self._get_pending_commands() self.ri._worker_helper._clear_dispatched('vumi', 'api') for command in pending_commands: yield self.ri.dispatch_raw( "%s.control" % (self._worker_name(),), command) @inlineCallbacks def dispatch_command(self, command, *args, **kw): cmd = VumiApiCommand.command( self._worker_name(), command, *args, **kw) yield self.dispatch_raw('vumi.api', cmd) yield self.dispatch_commands_to_router() def get_published_metrics(self, worker): return [ (metric.name, value) for metric, ((time, value),) in worker.metrics._oneshot_msgs] def get_dispatched_router_events(self): return self.get_dispatched('vumi', 'event', VumiApiEvent)