def test_md5(self): evaluator = ApkEvaluator(Criteria(md5={'123', '456'})) self.assertTrue(evaluator.satisfies_md5(Apk(md5='123'))) self.assertFalse(evaluator.satisfies_md5(Apk(md5='789'))) self.assertTrue(evaluator.satisfies_md5(Apk(md5='456'))) self.assertFalse(evaluator.satisfies_md5(Apk(md5='035'))) self.assertFalse(evaluator.satisfies_md5(Apk()))
def test_pkg_name(self): evaluator = ApkEvaluator(Criteria(pkg_name=['name1', 'name2'])) self.assertTrue(evaluator.satisfies_name(Apk(pkg_name='name1'))) self.assertTrue(evaluator.satisfies_name(Apk(pkg_name='name2'))) self.assertFalse(evaluator.satisfies_name(Apk(pkg_name='name3'))) self.assertFalse(evaluator.satisfies_name(Apk(pkg_name='name4'))) self.assertFalse(evaluator.satisfies_name(Apk()))
def test_sha1(self): evaluator = ApkEvaluator(Criteria(sha1={'123', '456'})) self.assertTrue(evaluator.satisfies_sha1(Apk(sha1='123'))) self.assertFalse(evaluator.satisfies_sha1(Apk(sha1='789'))) self.assertTrue(evaluator.satisfies_sha1(Apk(sha1='456'))) self.assertFalse(evaluator.satisfies_sha1(Apk(sha1='035'))) self.assertFalse(evaluator.satisfies_sha1(Apk()))
def setUp(self): self.apk = Apk(sha256='1234', pkg_name='apk1') self.apk2 = Apk(sha256='5678', pkg_name='apk2') self.dataset = Dataset(self.apk, self.apk2) self.constructor_mock = mock.create_autospec(UrlConstructor) self.constructor_mock.construct.side_effect = lambda apk: ' https://' + apk.sha256 # use sha256 of apk as download url, just for a test self.dataset_downloader = DatasetDownloader( self.dataset, url_constructor=self.constructor_mock, out_dir='out')
def test_initializes_from_file(self): source = Source(input_file='resources/sample.csv') expected_apks = [Apk(**{'sha256': '0000003B455A6C7AF837EF90F2EAFFD856E3B5CF49F5E27191430328DE2FA670','sha1':'9C14D537A7ADB4CFC43D291352F73E05E0CCDD4A','md5':'3EDFC78AB53521942798AD551027D04F','dex_date':'2016-04-05 17:58:46','apk_size':'10386469','pkg_name':'com.zte.bamachaye','vercode':'121','vt_detection':'0','vt_scan_date':'2016-06-15 15:26:44','dex_size':'4765888','markets':'anzhi'}), Apk(**{'sha256': '00000439A3FFA123C3F9BC45E5E821351B1A5C276871B36447AB80C74261F354','sha1':'375D6FFD167BB5E7E2935B1B927F87D8E44A9AB4','md5':'9283C74DD8356C18BB6D94B88B8FDD9B','dex_date':'2011-10-25 02:30:56','apk_size':'1044597','pkg_name':'bmthx.god102409paperi','vercode':'6','vt_detection':'1','vt_scan_date':'2014-04-27 06:30:31','dex_size':'105660','markets':'appchina'})] actual_apks = [] for apk in source: actual_apks.append(apk) self.assertEqual(actual_apks, expected_apks)
def test_vt_detection(self): evaluator = ApkEvaluator( Criteria(vt_detection_from=7, vt_detection_to=40)) self.assertTrue(evaluator.satisfies_vt_detection(Apk(vt_detection=8))) self.assertTrue(evaluator.satisfies_vt_detection(Apk(vt_detection=12))) self.assertFalse(evaluator.satisfies_vt_detection(Apk(vt_detection=5))) self.assertFalse( evaluator.satisfies_vt_detection(Apk(vt_detection=100))) self.assertFalse(evaluator.satisfies_vt_detection(Apk()))
def test_saves_metadata(self): dataset = Dataset( Apk(pkg_name='apk1', apk_size=8, dex_date='01-01-2001', markets='play'), Apk(pkg_name='apk2', apk_size=13, dex_date='01-03-2001', markets='play|china')) MetadataSaver(dataset=dataset, out_dir='out').save(['pkg_name', 'apk_size', 'dex_date']) self.assertTrue(os.path.exists(r'out\metadata.csv'))
def __next__(self): try: line = next(self.reader) except StopIteration: self.input_file.close() raise StopIteration return Apk(*line)
def __next__(self): try: line = next(self.input_file) except StopIteration: self.input_file.close() raise StopIteration columns = line.strip('\n').replace('"', '').split(',') return Apk(*columns)
def test_return_dataset_of_size_n(self): subset = RandomPicker().get_random_subset( Dataset(Apk('apk1'), Apk('apk2'), Apk('apk3')), 2) self.assertEqual(len(subset), 2) subset = RandomPicker().get_random_subset( Dataset(Apk('apk1'), Apk('apk2'), Apk('apk3'), Apk('apk4')), 3) self.assertEqual(len(subset), 3)
def test_saves_metadata(self): dataset = Dataset(Apk(pkg_name='apk1', apk_size=8, dex_date='01-01-2001', markets='play'), Apk(pkg_name='apk2', apk_size=13, dex_date='01-03-2001', markets='play|china')) MetadataSaver(dataset=dataset, out_dir='out').save(['pkg_name', 'apk_size', 'dex_date', 'markets']) expected_out = 'pkg_name,apk_size,dex_date,markets\n\ apk1,8,01-01-2001,play\n\ apk2,13,01-03-2001,china|play\n\ ' self.assertTrue(os.path.exists(r'out/metadata.csv')) with open('out/metadata.csv') as f: self.assertEqual(expected_out, f.read())
def test_hadles_commas_in_column(self): source = Source(input_file=os.path.join(THIS_DIR, 'resources/commas_in_column.csv')) try: actual_apk = next(source) expected_apk = Apk(**{'sha256': 'BC564D52C6E79E1676C19D9602B1359A33B8714A1DC5FCB8ED602209D0B70266', 'sha1': '1E56DD37F5E9DD8DCA2D41720110DAFDEFF89E90', 'md5': '25839816B7BBB4BB766EC1816C51C3C3', 'dex_date': '2013-11-23 19:41:08', 'apk_size': '8344281', 'pkg_name': 'com.androidemu.gbalvbaoshi,snaggamea', 'vercode': '23', 'vt_detection': '31', 'vt_scan_date': '2018-07-23 15:18:33', 'dex_size': '358188', 'markets': 'VirusShare'}) finally: source.input_file.close() self.assertEqual(actual_apk, expected_apk)
def test_return_subset_of_dataset(self): initial_dataset = Dataset(Apk('apk1'), Apk('apk2'), Apk('apk3'), Apk('apk4'), Apk('apk5'), Apk('apk6')) subset = RandomPicker().get_random_subset(initial_dataset, 4) self.assertTrue(initial_dataset.contains(subset)) subset = RandomPicker().get_random_subset(initial_dataset, 2) self.assertTrue(initial_dataset.contains(subset)) self.assertEqual(len(subset), 2)
def test_equals(self): self.assertEqual(Dataset(), Dataset()) dataset2 = Dataset(Apk('apk1'), Apk('apk2'), Apk('apk3'), Apk('apk4'), Apk('apk5')) self.assertEqual(self.dataset, dataset2) self.assertEqual(hash(self.dataset), hash(dataset2)) dataset2.add(Apk('apk6')) self.assertNotEqual(hash(self.dataset), hash(dataset2))
def test_markets(self): evaluator = ApkEvaluator( Criteria(markets={'google.play.com', 'chinese.market'})) self.assertTrue( evaluator.satisfies_markets(Apk(markets='google.play.com'))) self.assertTrue( evaluator.satisfies_markets(Apk(markets='chinese.market'))) self.assertTrue( evaluator.satisfies_markets( Apk(markets='google.play.com|chinese.market'))) self.assertFalse( evaluator.satisfies_markets(Apk(markets='another.chinese.market'))) self.assertFalse( evaluator.satisfies_markets(Apk(markets='onemore.chinese.market'))) self.assertFalse(evaluator.satisfies_markets(Apk()))
def test_all(self): evaluator = ApkEvaluator( Criteria(dex_date_from='2016-3-3 00:00:01', dex_date_to='2016-3-5 23:59:59', apk_size_from=1, apk_size_to=4, pkg_name=['pkg1', 'pkg2'], vt_detection_from=1, vt_detection_to=5, markets={'market1', 'market2'}, sha256={'adf', '789'})) self.assertTrue( evaluator.satisfies( Apk(dex_date='2016-3-4 17:58:00', apk_size=3, pkg_name='pkg1', vt_detection=3, markets='market1', sha256='adf'))) self.assertTrue( evaluator.satisfies( Apk(dex_date='2016-3-3 17:58:00', apk_size=4, pkg_name='pkg2', vt_detection=4, markets='market1|market2', sha256='789'))) self.assertFalse( evaluator.satisfies( Apk(dex_date='2016-3-3 17:58:00', apk_size=4, pkg_name='pkg2', vt_detection=4, markets='market1|market2'))) self.assertFalse( evaluator.satisfies( Apk(dex_date='2016-3-4 17:58:00', apk_size=5, pkg_name='pkg1', vt_detection=3, markets='market1'))) self.assertFalse( evaluator.satisfies( Apk(dex_date='2016-3-4 17:58:00', apk_size=3, pkg_name='pkg3', vt_detection=3, markets='market1'))) self.assertFalse( evaluator.satisfies( Apk(dex_date='2016-3-4 17:58:00', apk_size=3, pkg_name='pkg1', vt_detection=0, markets='market1'))) self.assertFalse( evaluator.satisfies( Apk(dex_date='2016-3-4 17:58:00', apk_size=3, pkg_name='pkg1', vt_detection=3, markets='market8'))) self.assertFalse( evaluator.satisfies( Apk(dex_date='2016-3-4 17:58:00', apk_size=3, pkg_name='pkg1', vt_detection=3, markets='market8'))) self.assertFalse(evaluator.satisfies(Apk()))
def test_dex_date(self): evaluator = ApkEvaluator( Criteria(dex_date_from='2016-3-3', dex_date_to='2016-3-5')) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-3-3 17:58:23'))) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-3-4 2:30:00'), )) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-3-5 00:00:00'))) self.assertFalse( evaluator.satisfies_date(Apk(dex_date='2016-3-2 17:58:07'))) self.assertFalse( evaluator.satisfies_date(Apk(dex_date='2016-3-6 17:58:08'))) evaluator = ApkEvaluator( Criteria(dex_date_from='2016-3-5', dex_date_to='2016-5-5')) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-3-7 17:58:00'))) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-5-4 17:58:00'))) self.assertFalse( evaluator.satisfies_date(Apk(dex_date='2016-2-13 17:58:00'))) self.assertFalse(evaluator.satisfies_date(Apk())) evaluator = ApkEvaluator(Criteria(dex_date_from='2016-3-3')) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-4-3 17:58:00'))) self.assertFalse( evaluator.satisfies_date(Apk(dex_date='2016-2-3 17:58:00'))) evaluator = ApkEvaluator(Criteria(dex_date_to='2016-3-3')) self.assertFalse( evaluator.satisfies_date(Apk(dex_date='2016-4-3 17:58:00'))) self.assertTrue( evaluator.satisfies_date(Apk(dex_date='2016-2-3 17:58:00')))
def test_apk_size(self): evaluator = ApkEvaluator(Criteria(apk_size_from=10, apk_size_to=20)) self.assertTrue(evaluator.satisfies_size(Apk(apk_size=15))) self.assertFalse(evaluator.satisfies_size(Apk(apk_size=5))) self.assertTrue(evaluator.satisfies_size(Apk(apk_size=20))) self.assertFalse(evaluator.satisfies_size(Apk()))
def test_return_random_subset(self): initial_dataset = Dataset(Apk('apk1'), Apk('apk2'), Apk('apk3'), Apk('apk4'), Apk('apk5'), Apk('apk6')) picker = RandomPicker(seed=12) random_subset1 = picker.get_random_subset(initial_dataset, 3) expected_random_subset1 = Dataset(Apk('apk3'), Apk('apk4'), Apk('apk1')) self.assertEqual(random_subset1, expected_random_subset1) random_subset2 = picker.get_random_subset(initial_dataset, 3) expected_random_subset2 = Dataset(Apk('apk2'), Apk('apk5'), Apk('apk6')) self.assertEqual(random_subset2, expected_random_subset2) random_subset3 = picker.get_random_subset(initial_dataset, 3) expected_random_subset3 = Dataset(Apk('apk1'), Apk('apk4'), Apk('apk3')) self.assertEqual(random_subset3, expected_random_subset3)
def setUp(self): self.dataset = Dataset(Apk('apk1'), Apk('apk2'), Apk('apk3'), Apk('apk4'), Apk('apk5'))
def test_returns_whole_dataset_if_dataset_size_less_then_requested_size( self): input_dataset = Dataset(Apk('apk1'), Apk('apk2')) subset = RandomPicker().get_random_subset(input_dataset, 4) self.assertEqual(subset, input_dataset)
def test_create_url(self): url = UrlConstructor(base_url=r'http:\\azoo.com\?key={}&sha={}', key='mykey').construct(Apk(sha256=123)) self.assertEqual(url, r'http:\\azoo.com\?key=mykey&sha=123') url = UrlConstructor(base_url=r'http:\\azoo.com\?key={}&sha={}', key='mykey').construct(Apk(sha256=456)) self.assertEqual(url, r'http:\\azoo.com\?key=mykey&sha=456')