def test_resource_client_blocking(self): """ test_resource_client_blocking Test the client can block on remote resource command results. """ # Publish link up events. self.terrestrial_link_up() self.remote_link_up() remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id=IA_RESOURCE_ID, process=FakeProcess()) # Queue up a series of fake commands to be handled by the remote side. """ {'time_completed': 1350421095.804607, 'resource_id': '123xyz', 'time_queued': 1350421095.623531, 'args': [], 'type_': 'RemoteCommand', 'command': 'ping_agent', 'result': 'ping from InstrumentAgent (name=Agent007,id=Edwards-MacBook-Pro_local_10126.35,type=agent), time: 1350421095757', 'kwargs': {}, 'svc_name': '', 'command_id': '76be11b4-a22c-49de-89cd-4e019463d7c9'} """ for i in range(self._no_requests): cmd = remote_client.ping_agent(remote_timeout=CFG.endpoint.receive.timeout) self.assertEqual(cmd.resource_id, IA_RESOURCE_ID) self.assertEqual(cmd.command, 'ping_agent') self.assertIn('ping from InstrumentAgent', cmd.result) # Publish link down events. self.terrestrial_link_down() self.remote_link_down() # Block on terrestrial public telemetry events. self._done_telem_evt.get(timeout=CFG.endpoint.receive.timeout)
def test_resource_client_online(self): """ test_recourse_client_online Test the client transparently forwards commands to the remote resource while link is up. """ # Publish link up events. self.terrestrial_link_up() self.remote_link_up() remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id='fake_id', process=FakeProcess()) # Queue up a series of fake commands to be handled by the remote side. for i in range(self._no_requests): cmd = remote_client.ping_agent() self._requests_sent[cmd.command_id] = cmd # Block on queue mod events. self._done_queue_mod_evt.get(timeout=CFG.endpoint.receive.timeout) # Block on command transmissions and results. self._done_cmd_tx_evt.get(timeout=CFG.endpoint.receive.timeout) self._done_cmd_evt.get(timeout=CFG.endpoint.receive.timeout) # Publish link down events. self.terrestrial_link_down() self.remote_link_down() # Block on terrestrial public telemetry events. self._done_telem_evt.get(timeout=CFG.endpoint.receive.timeout) self.assertItemsEqual(self._requests_sent.keys(), self._results_recv.keys())
def test_interfaces(self): """ test_interfaces Test that the client declare the correct interfaces. """ remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id='fake_id', process=FakeProcess()) interfaces = providedBy(remote_client) self.assertIn(IResourceAgent, interfaces) self.assertIn(ITerrestrialEndpoint, interfaces)
def test_resource_client_blocking(self): """ test_resource_client_blocking Test the client can block on remote resource command results. """ # Publish link up events. self.terrestrial_link_up() self.remote_link_up() remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id=IA_RESOURCE_ID, process=FakeProcess()) # Queue up a series of fake commands to be handled by the remote side. """ {'time_completed': 1350421095.804607, 'resource_id': '123xyz', 'time_queued': 1350421095.623531, 'args': [], 'type_': 'RemoteCommand', 'command': 'ping_agent', 'result': 'ping from InstrumentAgent (name=Agent007,id=Edwards-MacBook-Pro_local_10126.35,type=agent), time: 1350421095757', 'kwargs': {}, 'svc_name': '', 'command_id': '76be11b4-a22c-49de-89cd-4e019463d7c9'} """ for i in range(self._no_requests): cmd = remote_client.ping_agent( remote_timeout=CFG.endpoint.receive.timeout) self.assertEqual(cmd.resource_id, IA_RESOURCE_ID) self.assertEqual(cmd.command, 'ping_agent') self.assertIn('ping from InstrumentAgent', cmd.result) # Publish link down events. self.terrestrial_link_down() self.remote_link_down() # Block on terrestrial public telemetry events. self._done_telem_evt.get(timeout=CFG.endpoint.receive.timeout)
def test_errors(self): """ test_errors Test various error conditions. """ # Constructed without a xs name. with self.assertRaises(ConfigNotFound): remote_client = RemoteClient(iface=IResourceAgent, resource_id=IA_RESOURCE_ID, process=FakeProcess()) # Constructed without an interface. with self.assertRaises(ConfigNotFound): remote_client = RemoteClient(xs_name=self._xs_name, resource_id=IA_RESOURCE_ID, process=FakeProcess()) # Construct with invalid interface. with self.assertRaises(ConfigNotFound): remote_client = RemoteClient('Bogus_interface', xs_name=self._xs_name, resource_id=IA_RESOURCE_ID, process=FakeProcess()) # Construct with no resource or service specified. with self.assertRaises(ConfigNotFound): remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, process=FakeProcess()) # Construct with both resource and service specified. with self.assertRaises(ConfigNotFound): remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id=IA_RESOURCE_ID, svc_name='resource_registry', process=FakeProcess()) # Create a valid resource client. remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id=IA_RESOURCE_ID, process=FakeProcess()) # Send a command while link is down. with self.assertRaises(Conflict): result = remote_client.ping_agent() # Test port manipulators refused by remote proxy client. with self.assertRaises(BadRequest): remote_client.get_port() with self.assertRaises(BadRequest): remote_client.set_client_port() with self.assertRaises(BadRequest): remote_client.get_client_port()
def test_queue_manipulators(self): """ test_queue_manipulators Test ability to instpect and manipulate the command queue corresponding to this resource or service. """ remote_client = RemoteClient(iface=IResourceAgent, xs_name=self._xs_name, resource_id='fake_id', process=FakeProcess()) # Queue up a series of fake commands to be handled by the remote side. for i in range(self._no_requests): cmd = remote_client.ping_agent(link=False) self._requests_sent[cmd.command_id] = cmd # Block on queue mod events. self._done_queue_mod_evt.get(timeout=CFG.endpoint.receive.timeout) queue = remote_client.get_queue() self.assertEqual(len(queue), self._no_requests) popped = remote_client.clear_queue() self.assertEqual(len(popped), self._no_requests) self._requests_sent = {} # Queue up a series of fake commands to be handled by the remote side. for i in range(self._no_requests): cmd = remote_client.ping_agent(link=False) self._requests_sent[cmd.command_id] = cmd # Pop the last three commands. cmd_ids = self._requests_sent.keys()[:3] poped = [] for x in cmd_ids: poped.append(remote_client.pop_queue(x)) self._requests_sent.pop(x) queue = remote_client.get_queue() self.assertEqual(len(queue), self._no_requests - 3) self.assertEqual(len(poped), 3) self._no_requests = self._no_requests - 3 self._no_cmd_tx_evts = self._no_requests # Publish link up events. self.terrestrial_link_up() self.remote_link_up() # Block on command transmissions and results. self._done_cmd_tx_evt.get(timeout=CFG.endpoint.receive.timeout) pending = remote_client.get_pending() for x in pending: self.assertIn(x.command_id, self._requests_sent.keys()) self._done_cmd_evt.get(timeout=CFG.endpoint.receive.timeout) # Publish link down events. self.terrestrial_link_down() self.remote_link_down() # Block on terrestrial public telemetry events. self._done_telem_evt.get(timeout=CFG.endpoint.receive.timeout) self.assertItemsEqual(self._requests_sent.keys(), self._results_recv.keys())
def test_service_client_blocking(self): """ test_service_client_blocking Test the client can command remote services and block on their results. """ # Publish link up events. self.terrestrial_link_up() self.remote_link_up() # Create remote client for the resource registry. remote_client = RemoteClient(iface=IResourceRegistryService, xs_name=self._xs_name, svc_name='resource_registry', process=FakeProcess()) # Create user object. obj = IonObject("UserInfo", name="some_name") result = remote_client.create(obj, remote_timeout=CFG.endpoint.receive.timeout) # Returns obj_id, obj_rev. obj_id, obj_rev = result.result # Confirm the results are valid. #Result is a tuple of strings. #{'result': ['ad183ff26bae4f329ddd85fd69d160a9', #'1-00a308c45fff459c7cda1db9a7314de6'], #'command_id': 'cc2ae00d-40b0-47d2-af61-8ffb87f1aca2'} self.assertIsInstance(obj_id, str) self.assertNotEqual(obj_id, '') self.assertIsInstance(obj_rev, str) self.assertNotEqual(obj_rev, '') # Read user object. result = remote_client.read(obj_id, remote_timeout=CFG.endpoint.receive.timeout) # Returns read_obj. read_obj = result.result # Confirm the results are valid. #Result is a user info object with the name set. #{'lcstate': 'DEPLOYED_AVAILABLE', #'_rev': '1-851f067bac3c34b2238c0188b3340d0f', #'description': '', #'ts_updated': '1349213207638', #'type_': 'UserInfo', #'contact': <interface.objects.ContactInformation object at 0x10d7df590>, #'_id': '27832d93f4cd4535a75ac75c06e00a7e', #'ts_created': '1349213207638', #'variables': [{'name': '', 'value': ''}], #'name': 'some_name'} self.assertIsInstance(read_obj, UserInfo) self.assertEquals(read_obj.name, 'some_name') # Update user object. read_obj.name = 'some_other_name' result = remote_client.update(read_obj, remote_timeout=CFG.endpoint.receive.timeout) # Returns nothing. # Read user object. result = remote_client.read(obj_id, remote_timeout=CFG.endpoint.receive.timeout) # Returns read_obj. read_obj = result.result # Confirm results are valid. self.assertIsInstance(read_obj, UserInfo) self.assertEquals(read_obj.name, 'some_other_name') # Delete user object. result = remote_client.delete(obj_id, remote_timeout=CFG.endpoint.receive.timeout) # Returns nothing. # Publish link down events. self.terrestrial_link_down() self.remote_link_down() # Block on terrestrial public telemetry events. self._done_telem_evt.get(timeout=CFG.endpoint.receive.timeout)
def test_service_client_blocking(self): """ test_service_client_blocking Test the client can command remote services and block on their results. """ # Publish link up events. self.terrestrial_link_up() self.remote_link_up() # Create remote client for the resource registry. remote_client = RemoteClient(iface=IResourceRegistryService, xs_name=self._xs_name, svc_name='resource_registry', process=FakeProcess()) # Create user object. obj = IonObject("UserInfo", name="some_name") result = remote_client.create( obj, remote_timeout=CFG.endpoint.receive.timeout) # Returns obj_id, obj_rev. obj_id, obj_rev = result.result # Confirm the results are valid. #Result is a tuple of strings. #{'result': ['ad183ff26bae4f329ddd85fd69d160a9', #'1-00a308c45fff459c7cda1db9a7314de6'], #'command_id': 'cc2ae00d-40b0-47d2-af61-8ffb87f1aca2'} self.assertIsInstance(obj_id, str) self.assertNotEqual(obj_id, '') self.assertIsInstance(obj_rev, str) self.assertNotEqual(obj_rev, '') # Read user object. result = remote_client.read( obj_id, remote_timeout=CFG.endpoint.receive.timeout) # Returns read_obj. read_obj = result.result # Confirm the results are valid. #Result is a user info object with the name set. #{'lcstate': 'DEPLOYED_AVAILABLE', #'_rev': '1-851f067bac3c34b2238c0188b3340d0f', #'description': '', #'ts_updated': '1349213207638', #'type_': 'UserInfo', #'contact': <interface.objects.ContactInformation object at 0x10d7df590>, #'_id': '27832d93f4cd4535a75ac75c06e00a7e', #'ts_created': '1349213207638', #'variables': [{'name': '', 'value': ''}], #'name': 'some_name'} self.assertIsInstance(read_obj, UserInfo) self.assertEquals(read_obj.name, 'some_name') # Update user object. read_obj.name = 'some_other_name' result = remote_client.update( read_obj, remote_timeout=CFG.endpoint.receive.timeout) # Returns nothing. # Read user object. result = remote_client.read( obj_id, remote_timeout=CFG.endpoint.receive.timeout) # Returns read_obj. read_obj = result.result # Confirm results are valid. self.assertIsInstance(read_obj, UserInfo) self.assertEquals(read_obj.name, 'some_other_name') # Delete user object. result = remote_client.delete( obj_id, remote_timeout=CFG.endpoint.receive.timeout) # Returns nothing. # Publish link down events. self.terrestrial_link_down() self.remote_link_down() # Block on terrestrial public telemetry events. self._done_telem_evt.get(timeout=CFG.endpoint.receive.timeout)