def test_workflow_exception_when_tensor_flow_inference_call_fails(self):
     self.mock_tf_call_service.run.side_effect = WorkflowException()
     self.workflow = WorkFlow(self.graph, self.chunk_image,
                              self.mock_tf_call_service,
                              self.mock_apply_coordinate_correction, None,
                              None, None, None, self.provider)
     self.workflow.run()
     self.workflow.apply_coordinate_correction.run.assert_not_called()
 def test_workflow_exception_when_chunk_fails(self):
     self.mock_chunk_image.run.side_effect = WorkflowException()
     self.tf_call_service = mock.MagicMock(TfCall())
     self.workflow = WorkFlow(self.graph, self.mock_chunk_image,
                              self.tf_call_service, None, None, None, None,
                              None, self.provider)
     self.workflow.run()
     self.workflow.tf_call_service.run.assert_not_called()
 def test_workflow_exception_when_apply_coordinate_correction_fails(self):
     self.mock_tf_call_service.run.return_value = [(1536, 8192),
                                                   (1536, 8192)]
     self.workflow = WorkFlow(self.graph, self.chunk_image,
                              self.mock_tf_call_service,
                              self.apply_coordinate_correction,
                              self.mock_filter_merge_boxes, None, None,
                              None, self.provider)
     self.workflow.run()
     self.workflow.filter_merge_boxes.run.assert_not_called()
 def test_successfull_processing_of_workflow(self):
     self.mock_tf_call_service.run.return_value = \
                 constants.TF_COORDINATES_RECT_OBJECT
     self.mock_label_service.return_value = [LabelDetected()]
     self.workflow = WorkFlow(
         self.graph, self.chunk_image, self.mock_tf_call_service,
         self.apply_coordinate_correction, self.filter_merge_boxes,
         self.mock_label_service, self.coordinate_storage,
         self.post_processing, self.provider)
     self.workflow.run()
     self.workflow.provider.acknowledge.assert_called()
 def test_workflow_exception_when_storage_coordinates_fails(self):
     self.mock_tf_call_service.run.return_value = \
         {(1536, 8192):
          [Rect(562, 954, 665, 111, 0.3364628255367279)]}
     self.mock_coordinate_storage.store.side_effect = Exception()
     self.workflow = WorkFlow(
         self.graph, self.chunk_image, self.mock_tf_call_service,
         self.apply_coordinate_correction, self.filter_merge_boxes,
         self.mock_label_service, self.mock_coordinate_storage,
         self.mock_post_processing, self.provider)
     self.workflow.run()
     self.workflow.provider.acknowledge.assert_not_called()
 def test_workflow_exception_when_filter_merge_boxes_fails(self):
     self.mock_tf_call_service.run.return_value = \
         {(1536, 8192):
          [Rect(562, 954, 665, 111, 0.3364628255367279)]}
     self.mock_filter_merge_boxes.run.side_effect = WorkflowException()
     self.workflow = WorkFlow(self.graph, self.chunk_image,
                              self.mock_tf_call_service,
                              self.apply_coordinate_correction,
                              self.mock_filter_merge_boxes,
                              self.mock_label_service, None, None,
                              self.provider)
     self.workflow.run()
     self.workflow.label_service.request_labels.assert_not_called()
class TestWorkflowService(unittest.TestCase):
    def setUp(self):
        self.bus = mock.MagicMock(ServiceBusService)
        self.subscriber = StatefulAzureServiceBusClient(
            self.bus, "topic", "sub", "pano_upload_event")
        self.blob = mock.MagicMock(AzurePanoBytesService)
        self.provider = mock.MagicMock(
            AzurePanoProvider(self.subscriber, self.blob))
        self.coordinate_storage = \
            mock.MagicMock(AzureCoordinateStorageService)

        self.chunk_image = ChunkImages()
        self.mock_chunk_image = mock.MagicMock(ChunkImages)

        self.tf_call_service = TfCall()
        self.mock_tf_call_service = mock.MagicMock(TfCall)

        self.apply_coordinate_correction = CoordinateCorrection()
        self.mock_apply_coordinate_correction = mock.MagicMock(
            CoordinateCorrection)

        self.filter_merge_boxes = FilterMergeBoxesImpl()
        self.mock_filter_merge_boxes = mock.MagicMock(FilterMergeBoxesImpl)

        self.mock_label_service = mock.MagicMock(RedisLabelLookupService)
        self.mock_coordinate_storage = mock.MagicMock(
            AzureCoordinateStorageService)
        self.post_processing = PostProcessing()
        self.mock_post_processing = mock.MagicMock(PostProcessing)

        self.header = AnalyticsHeader(
            customer_id='CUST-1',
            store_id='STORE-1',
            aisle_id='ASILE-1',
            generated_at=None,
            unique_id=None,
            robot_id='ROBOT-1',
            run_id='1',
            context=None,
        )
        self.event = PanoUploadEvent(url="foo",
                                     container_name='container',
                                     header=self.header)
        self.envelope = PanoEventEnvelope(self.event, "a-b-c")
        message = Message(body=binary_serialize(self.envelope))
        self.good_message = message
        TEST_IMAGE = os.path.join(os.path.dirname(os.path.dirname(__file__)),
                                  'files', 'panos',
                                  'a6_0_2048_2048_output.jpg')

        with open(TEST_IMAGE, 'r') as fd:
            self.byte_array = np.fromfile(fd, dtype='uint8')

        self.pano_event_envelope = binary_deserialize(self.good_message.body,
                                                      PanoEventEnvelope)
        self.provider.provide.return_value = AzurePanoBytesResponse(
            self.byte_array, self.pano_event_envelope.pano_upload)
        self.graph = load_graph('dev')
        self.tf_call_service.graph = self.graph
        self.mock_tf_call_service.graph = self.graph

    @prometheus_metrics(pano_processsed_status=True)
    def test_successfull_processing_of_workflow(self):
        self.mock_tf_call_service.run.return_value = \
                    constants.TF_COORDINATES_RECT_OBJECT
        self.mock_label_service.return_value = [LabelDetected()]
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.coordinate_storage,
            self.post_processing, self.provider)
        self.workflow.run()
        self.workflow.provider.acknowledge.assert_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_chunk_fails(self):
        self.mock_chunk_image.run.side_effect = WorkflowException()
        self.tf_call_service = mock.MagicMock(TfCall())
        self.workflow = WorkFlow(self.graph, self.mock_chunk_image,
                                 self.tf_call_service, None, None, None, None,
                                 None, self.provider)
        self.workflow.run()
        self.workflow.tf_call_service.run.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_tensor_flow_inference_call_fails(self):
        self.mock_tf_call_service.run.side_effect = WorkflowException()
        self.workflow = WorkFlow(self.graph, self.chunk_image,
                                 self.mock_tf_call_service,
                                 self.mock_apply_coordinate_correction, None,
                                 None, None, None, self.provider)
        self.workflow.run()
        self.workflow.apply_coordinate_correction.run.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_apply_coordinate_correction_fails(self):
        self.mock_tf_call_service.run.return_value = [(1536, 8192),
                                                      (1536, 8192)]
        self.workflow = WorkFlow(self.graph, self.chunk_image,
                                 self.mock_tf_call_service,
                                 self.apply_coordinate_correction,
                                 self.mock_filter_merge_boxes, None, None,
                                 None, self.provider)
        self.workflow.run()
        self.workflow.filter_merge_boxes.run.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_filter_merge_boxes_fails(self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_filter_merge_boxes.run.side_effect = WorkflowException()
        self.workflow = WorkFlow(self.graph, self.chunk_image,
                                 self.mock_tf_call_service,
                                 self.apply_coordinate_correction,
                                 self.mock_filter_merge_boxes,
                                 self.mock_label_service, None, None,
                                 self.provider)
        self.workflow.run()
        self.workflow.label_service.request_labels.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_label_service_fails(self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_label_service.request_labels.side_effect = Exception()
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.mock_coordinate_storage, None,
            self.provider)
        self.workflow.run()
        self.workflow.coordinate_storage.store.assert_not_called()

    @prometheus_metrics(pano_processsed_status=True)
    def test_workflow_exception_when_label_service_returns_none(self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_label_service.request_labels.return_value = []
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.mock_coordinate_storage,
            self.post_processing, self.provider)
        self.workflow.run()
        self.workflow.coordinate_storage.store.assert_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_post_processing_fails(self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_post_processing.run.side_effect = WorkflowException()
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.mock_coordinate_storage,
            self.mock_post_processing, self.provider)
        self.workflow.run()
        self.workflow.provider.acknowledge.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_storage_coordinates_fails(self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_coordinate_storage.store.side_effect = Exception()
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.mock_coordinate_storage,
            self.mock_post_processing, self.provider)
        self.workflow.run()
        self.workflow.provider.acknowledge.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_storage_coordinates_fails(self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_coordinate_storage.store.side_effect = Exception()
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.mock_coordinate_storage,
            self.mock_post_processing, self.provider)
        self.workflow.run()
        self.workflow.provider.acknowledge.assert_not_called()

    @prometheus_metrics(pano_processsed_status=False)
    def test_workflow_exception_when_storage_coordinates_raises_http_error(
            self):
        self.mock_tf_call_service.run.return_value = \
            {(1536, 8192):
             [Rect(562, 954, 665, 111, 0.3364628255367279)]}
        self.mock_coordinate_storage.store.side_effect = AzureHttpError('', '')
        self.workflow = WorkFlow(
            self.graph, self.chunk_image, self.mock_tf_call_service,
            self.apply_coordinate_correction, self.filter_merge_boxes,
            self.mock_label_service, self.mock_coordinate_storage,
            self.mock_post_processing, self.provider)
        self.workflow.run()
        self.workflow.provider.acknowledge.assert_not_called()