def test_capabilities_raises_when_on_premise_21_11(self): # Arrange sub_analysis = SubAnalysis('ab', 'asd', 'axaxax', 'root', None) get_global_api().on_premise_version = OnPremiseVersion.V21_11 # Act and Assert with self.assertRaises(errors.UnsupportedOnPremiseVersionError): _ = sub_analysis.get_capabilities()
def test_sub_analysis_from_id_takes_parameters_from_composed_analysis_lazy_load_is_true( self): # Arrange analysis_id = str(uuid.uuid4()) composed_analysis_id = str(uuid.uuid4()) sha256 = 'axaxaxax' source = 'root' with responses.RequestsMock() as mock: mock.add( 'GET', url= f'{self.full_url}/analyses/{composed_analysis_id}/sub-analyses', status=HTTPStatus.OK, json={ 'sub_analyses': [{ 'source': source, 'sub_analysis_id': analysis_id, 'sha256': sha256 }, { 'source': 'static_extraction', 'sub_analysis_id': 'ac', 'sha256': 'ba' }] }) # Act sub_analysis = SubAnalysis.from_analysis_id( analysis_id, composed_analysis_id) # Assert self.assertEqual(sub_analysis.sha256, sha256) self.assertEqual(sub_analysis.source, source) self.assertIsNone(sub_analysis.extraction_info)
def get_analysis_code_reuse_command(intezer_api: IntezerApi, args: dict) -> CommandResults: analysis_id = args.get('analysis_id') sub_analysis_id = args.get('sub_analysis_id', 'root') try: sub_analysis: SubAnalysis = SubAnalysis( analysis_id=sub_analysis_id, composed_analysis_id=analysis_id, sha256='', source='', api=intezer_api) sub_analysis_code_reuse = sub_analysis.code_reuse except HTTPError as error: if error.response.status_code == HTTPStatus.NOT_FOUND: return _get_missing_analysis_result(analysis_id=str(analysis_id)) elif error.response.status_code == HTTPStatus.CONFLICT: return _get_analysis_running_result(analysis_id=str(analysis_id)) if not sub_analysis_code_reuse: return CommandResults( readable_output='No code reuse for this analysis') families = sub_analysis_code_reuse.pop( 'families') if 'families' in sub_analysis_code_reuse else None readable_output = tableToMarkdown('Code Reuse', sub_analysis_code_reuse) if families: readable_output += '\nFamilies:\n' readable_output += '\n'.join( tableToMarkdown(family['family_name'], family) for family in families) is_root = sub_analysis_id == 'root' if is_root: context_json = { 'Intezer.Analysis(obj.ID == val.ID)': { 'ID': analysis_id, 'CodeReuse': sub_analysis_code_reuse, 'CodeReuseFamilies': families } } else: context_json = { 'Intezer.Analysis(obj.RootAnalysis == val.ID).SubAnalyses(obj.ID == val.ID)': { 'ID': sub_analysis_id, 'RootAnalysis': analysis_id, 'CodeReuse': sub_analysis_code_reuse, 'CodeReuseFamilies': families } } return CommandResults(readable_output=readable_output, outputs=context_json, raw_response=sub_analysis.code_reuse)
def get_analysis_metadata_command(intezer_api: IntezerApi, args: dict) -> CommandResults: analysis_id = args.get('analysis_id') sub_analysis_id = args.get('sub_analysis_id', 'root') try: sub_analysis: SubAnalysis = SubAnalysis( analysis_id=sub_analysis_id, composed_analysis_id=analysis_id, sha256='', source='', extraction_info=None, api=intezer_api) sub_analysis_metadata = sub_analysis.metadata except HTTPError as error: if error.response.status_code == HTTPStatus.NOT_FOUND: return _get_missing_analysis_result(analysis_id=str(analysis_id)) elif error.response.status_code == HTTPStatus.CONFLICT: return _get_analysis_running_result(analysis_id=str(analysis_id)) raise metadata_table = tableToMarkdown('Analysis Metadata', sub_analysis_metadata) is_root = sub_analysis_id == 'root' if is_root: context_json = { 'Intezer.Analysis(obj.ID == val.ID)': { 'ID': analysis_id, 'Metadata': sub_analysis_metadata } } else: context_json = { 'Intezer.Analysis(obj.RootAnalysis == val.ID).SubAnalyses(obj.ID == val.ID)': { 'ID': sub_analysis_id, 'RootAnalysis': analysis_id, 'Metadata': sub_analysis_metadata } } return CommandResults(readable_output=metadata_table, outputs=context_json, raw_response=sub_analysis_metadata)
def test_sub_analysis_raises_when_getting_sha256_and_analysis_not_found_on_compose( self): # Arrange analysis_id = str(uuid.uuid4()) composed_analysis_id = str(uuid.uuid4()) sha256 = 'axaxaxax' source = 'root' with responses.RequestsMock() as mock: mock.add( 'GET', url= f'{self.full_url}/analyses/{composed_analysis_id}/sub-analyses', status=HTTPStatus.OK, json={'sub_analyses': []}) sub_analysis = SubAnalysis.from_analysis_id( analysis_id, composed_analysis_id) # Act with self.assertRaises(errors.SubAnalysisNotFoundError): _ = sub_analysis.sha256
def test_sub_analysis_from_id_return_none_when_analysis_not_found_on_composed( self): # Arrange analysis_id = str(uuid.uuid4()) composed_analysis_id = str(uuid.uuid4()) with responses.RequestsMock() as mock: mock.add( 'GET', url= f'{self.full_url}/analyses/{composed_analysis_id}/sub-analyses', status=HTTPStatus.OK, json={'sub_analyses': []}) # Act sub_analysis = SubAnalysis.from_analysis_id(analysis_id, composed_analysis_id, lazy_load=False) # Assert self.assertIsNone(sub_analysis)
def test_sub_analysis_operations(self): # Arrange with responses.RequestsMock() as mock: mock.add( 'POST', url=self.full_url + '/analyses/asd/sub-analyses/ab/code-reuse/families/ax/find-related-files', status=200, json={'result_url': 'a/b/related-files'}) mock.add( 'POST', url=self.full_url + '/analyses/asd/sub-analyses/ab/get-account-related-samples', status=200, json={'result_url': 'a/b/related-samples'}) mock.add('POST', url=self.full_url + '/analyses/asd/sub-analyses/ab/generate-vaccine', status=200, json={'result_url': 'a/b/vaccine'}) mock.add('POST', url=self.full_url + '/analyses/asd/sub-analyses/ab/strings', status=200, json={'result_url': 'a/b/strings'}) mock.add('POST', url=self.full_url + '/analyses/asd/sub-analyses/ab/string-related-samples', status=200, json={'result_url': 'a/b/string-related-samples'}) mock.add('POST', url=self.full_url + '/analyses/asd/sub-analyses/ab/capabilities', status=200, json={'result_url': 'a/b/capabilities'}) mock.add('GET', url=self.full_url + 'a/b/related-files', status=200, json={'result': { 'files': [] }}) mock.add('GET', url=self.full_url + 'a/b/related-samples', status=200, json={'result': { 'related_samples': [] }}) mock.add('GET', url=self.full_url + 'a/b/vaccine', status=200, json={'result': 'abd'}) mock.add('GET', url=self.full_url + 'a/b/strings', status=200, json={'result': 'abd'}) mock.add('GET', url=self.full_url + 'a/b/string-related-samples', status=200, json={'result': 'abd'}) mock.add('GET', url=self.full_url + 'a/b/capabilities', status=200, json={'result': 'abd'}) sub_analysis = SubAnalysis('ab', 'asd', 'axaxax', 'root', None) # Act related_files_operation = sub_analysis.find_related_files( 'ax', wait=True) related_samples_operation = sub_analysis.get_account_related_samples( wait=True) vaccine_operation = sub_analysis.generate_vaccine(wait=True) strings_operation = sub_analysis.get_strings(wait=True) string_related_operation = sub_analysis.get_string_related_samples( 'test', wait=True) capabilities = sub_analysis.get_capabilities(wait=True) # Assert self.assertIsNotNone(related_files_operation.get_result()) self.assertIsNotNone(related_samples_operation.get_result()) self.assertIsNotNone(vaccine_operation.get_result()) self.assertIsNotNone(strings_operation.get_result()) self.assertIsNotNone(string_related_operation.get_result()) self.assertIsNotNone(capabilities.get_result())