class DataRetrieverServiceTest(PyonTestCase):
    def setUp(self):
        mock_clients = self._create_service_mock('data_retriever')
        self.data_retriever_service = DataRetrieverService()
        self.data_retriever_service.clients = mock_clients
        self.mock_rr_create = self.data_retriever_service.clients.resource_registry.create
        self.mock_rr_create_assoc = self.data_retriever_service.clients.resource_registry.create_association
        self.mock_rr_read = self.data_retriever_service.clients.resource_registry.read
        self.mock_rr_update = self.data_retriever_service.clients.resource_registry.update
        self.mock_rr_delete = self.data_retriever_service.clients.resource_registry.delete
        self.mock_rr_delete_assoc = self.data_retriever_service.clients.resource_registry.delete_association
        self.mock_rr_find_assoc = self.data_retriever_service.clients.resource_registry.find_associations
        self.mock_ps_create_stream = self.data_retriever_service.clients.pubsub_management.create_stream
        self.mock_ps_create_stream_definition = self.data_retriever_service.clients.pubsub_management.create_stream_definition
        self.data_retriever_service.container = DotDict({
            'id':'123',
            'spawn_process':Mock(),
            'proc_manager':DotDict({
                'terminate_process':Mock(),
                'procs':[]
            }),
            'datastore_manager':DotDict({
                'get_datastore':Mock()
            })
        })
        self.datastore = DotDict({
            'query_view':Mock()
        })
        self.data_retriever_service.container.datastore_manager.get_datastore.return_value = self.datastore
        self.mock_cc_spawn = self.data_retriever_service.container.spawn_process
        self.mock_cc_terminate = self.data_retriever_service.container.proc_manager.terminate_process
        self.mock_pd_schedule = self.data_retriever_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.data_retriever_service.clients.process_dispatcher.cancel_process
        self.mock_ds_read = self.data_retriever_service.clients.dataset_management.read_dataset
        self.data_retriever_service.process_definition = ProcessDefinition()
        self.data_retriever_service.process_definition.executable['module'] = 'ion.processes.data.replay_process'
        self.data_retriever_service.process_definition.executable['class'] = 'ReplayProcess'

        self.data_retriever_service.process_definition_id = 'mock_procdef_id'

    @unittest.skip('Can we mock the datastore manager?')
    def test_define_replay(self):
        #mocks
        self.mock_ps_create_stream.return_value = '12345'
        self.mock_rr_create.return_value = ('replay_id','garbage')
        self.mock_ds_read.return_value = DotDict({
            'datastore_name':'unittest',
            'view_name':'garbage',
            'primary_view_key':'primary key'})

        document = DotDict({'stream_resource_id':'0'})
        self.mock_pd_schedule.return_value = 'process_id'

        self.datastore.query_view.return_value = [{'doc':document}]

        config = {'process':{
            'query':'myquery',
            'datastore_name':'unittest',
            'view_name':'garbage',
            'key_id':'primary key',
            'delivery_format':None,
            'publish_streams':{'output':'12345'}
        }}


        # execution
        r,s = self.data_retriever_service.define_replay(dataset_id='dataset_id', query='myquery')

        # assertions
        self.assertTrue(self.mock_ps_create_stream_definition.called)
        self.assertTrue(self.mock_ps_create_stream.called)
        self.assertTrue(self.mock_rr_create.called)
        self.mock_rr_create_assoc.assert_called_with('replay_id',PRED.hasStream,'12345',None)
        self.assertTrue(self.mock_pd_schedule.called)
        self.assertTrue(self.mock_rr_update.called)
        self.assertEquals(r,'replay_id')
        self.assertEquals(s,'12345')

    def test_define_replay_no_data(self):
        #mocks
        self.mock_ps_create_stream.return_value = '12345'
        self.mock_rr_create.return_value = ('replay_id','garbage')
        self.mock_ds_read.return_value = DotDict({
            'datastore_name':'unittest',
            'view_name':'garbage',
            'primary_view_key':'primary key'})

        document = DotDict({'stream_resource_id':'0'})
        self.mock_pd_schedule.return_value = 'process_id'

        self.datastore.query_view.return_value = [] # Raises index error

        config = {'process':{
            'query':'myquery',
            'datastore_name':'unittest',
            'view_name':'garbage',
            'key_id':'primary key',
            'delivery_format':None,
            'publish_streams':{'output':'12345'}
        }}


        with self.assertRaises(NotFound):
            self.data_retriever_service.define_replay(dataset_id='dataset_id', query='myquery')


    @unittest.skip('Can\'t do unit test here')
    def test_start_replay(self):
        pass


    def test_cancel_replay(self):
        #mocks
        self.mock_rr_find_assoc.return_value = [1,2,3]

        replay = Replay()
        replay.process_id = '1'
        self.mock_rr_read.return_value = replay

        #execution
        self.data_retriever_service.cancel_replay('replay_id')

        #assertions
        self.assertEquals(self.mock_rr_delete_assoc.call_count,3)
        self.mock_rr_delete.assert_called_with('replay_id')

        self.mock_pd_cancel.assert_called_with('1')
Example #2
0
class DataRetrieverServiceTest(PyonTestCase):
    def setUp(self):
        mock_clients = self._create_service_mock('data_retriever')
        self.data_retriever_service = DataRetrieverService()
        self.data_retriever_service.clients = mock_clients
        self.mock_rr_create = self.data_retriever_service.clients.resource_registry.create
        self.mock_rr_create_assoc = self.data_retriever_service.clients.resource_registry.create_association
        self.mock_rr_read = self.data_retriever_service.clients.resource_registry.read
        self.mock_rr_update = self.data_retriever_service.clients.resource_registry.update
        self.mock_rr_delete = self.data_retriever_service.clients.resource_registry.delete
        self.mock_rr_delete_assoc = self.data_retriever_service.clients.resource_registry.delete_association
        self.mock_rr_find_assoc = self.data_retriever_service.clients.resource_registry.find_associations
        self.mock_ps_create_stream = self.data_retriever_service.clients.pubsub_management.create_stream
        self.mock_ps_create_stream_definition = self.data_retriever_service.clients.pubsub_management.create_stream_definition
        self.data_retriever_service.container = DotDict({
            'id':
            '123',
            'spawn_process':
            Mock(),
            'proc_manager':
            DotDict({
                'terminate_process': Mock(),
                'procs': []
            }),
            'datastore_manager':
            DotDict({'get_datastore': Mock()})
        })
        self.datastore = DotDict({'query_view': Mock()})
        self.data_retriever_service.container.datastore_manager.get_datastore.return_value = self.datastore
        self.mock_cc_spawn = self.data_retriever_service.container.spawn_process
        self.mock_cc_terminate = self.data_retriever_service.container.proc_manager.terminate_process
        self.mock_pd_schedule = self.data_retriever_service.clients.process_dispatcher.schedule_process
        self.mock_pd_cancel = self.data_retriever_service.clients.process_dispatcher.cancel_process
        self.mock_ds_read = self.data_retriever_service.clients.dataset_management.read_dataset
        self.data_retriever_service.process_definition = ProcessDefinition()
        self.data_retriever_service.process_definition.executable[
            'module'] = 'ion.processes.data.replay_process'
        self.data_retriever_service.process_definition.executable[
            'class'] = 'ReplayProcess'

        self.data_retriever_service.process_definition_id = 'mock_procdef_id'

    @unittest.skip('Can we mock the datastore manager?')
    def test_define_replay(self):
        #mocks
        self.mock_ps_create_stream.return_value = '12345'
        self.mock_rr_create.return_value = ('replay_id', 'garbage')
        self.mock_ds_read.return_value = DotDict({
            'datastore_name':
            'unittest',
            'view_name':
            'garbage',
            'primary_view_key':
            'primary key'
        })

        document = DotDict({'stream_resource_id': '0'})
        self.mock_pd_schedule.return_value = 'process_id'

        self.datastore.query_view.return_value = [{'doc': document}]

        config = {
            'process': {
                'query': 'myquery',
                'datastore_name': 'unittest',
                'view_name': 'garbage',
                'key_id': 'primary key',
                'delivery_format': None,
                'publish_streams': {
                    'output': '12345'
                }
            }
        }

        # execution
        r, s = self.data_retriever_service.define_replay(
            dataset_id='dataset_id', query='myquery')

        # assertions
        self.assertTrue(self.mock_ps_create_stream_definition.called)
        self.assertTrue(self.mock_ps_create_stream.called)
        self.assertTrue(self.mock_rr_create.called)
        self.mock_rr_create_assoc.assert_called_with('replay_id',
                                                     PRED.hasStream, '12345',
                                                     None)
        self.assertTrue(self.mock_pd_schedule.called)
        self.assertTrue(self.mock_rr_update.called)
        self.assertEquals(r, 'replay_id')
        self.assertEquals(s, '12345')

    def test_define_replay_no_data(self):
        #mocks
        self.mock_ps_create_stream.return_value = '12345'
        self.mock_rr_create.return_value = ('replay_id', 'garbage')
        self.mock_ds_read.return_value = DotDict({
            'datastore_name':
            'unittest',
            'view_name':
            'garbage',
            'primary_view_key':
            'primary key'
        })

        document = DotDict({'stream_resource_id': '0'})
        self.mock_pd_schedule.return_value = 'process_id'

        self.datastore.query_view.return_value = []  # Raises index error

        config = {
            'process': {
                'query': 'myquery',
                'datastore_name': 'unittest',
                'view_name': 'garbage',
                'key_id': 'primary key',
                'delivery_format': None,
                'publish_streams': {
                    'output': '12345'
                }
            }
        }

        with self.assertRaises(NotFound):
            self.data_retriever_service.define_replay(dataset_id='dataset_id',
                                                      query='myquery')

    @unittest.skip('Can\'t do unit test here')
    def test_start_replay(self):
        pass

    def test_cancel_replay(self):
        #mocks
        self.mock_rr_find_assoc.return_value = [1, 2, 3]

        replay = Replay()
        replay.process_id = '1'
        self.mock_rr_read.return_value = replay

        #execution
        self.data_retriever_service.cancel_replay('replay_id')

        #assertions
        self.assertEquals(self.mock_rr_delete_assoc.call_count, 3)
        self.mock_rr_delete.assert_called_with('replay_id')

        self.mock_pd_cancel.assert_called_with('1')