def test_fetch_pass_fail(self): """Test fetching multiple tools with some passing and some failing""" def handle_download(_): """Take the tools.Download() function by writing a file""" if self.seq: raise urllib.error.URLError('not found') self.seq += 1 tools.WriteFile(fname, expected) return fname, dirname expected = b'this is a test' dirname = os.path.join(self._indir, 'download_dir') os.mkdir(dirname) fname = os.path.join(dirname, 'downloaded') destdir = os.path.join(self._indir, 'dest_dir') os.mkdir(destdir) dest_fname = os.path.join(destdir, '_testing') self.seq = 0 with unittest.mock.patch.object(bintool, 'DOWNLOAD_DESTDIR', destdir): with unittest.mock.patch.object(tools, 'Download', side_effect=handle_download): with test_util.capture_sys_output() as (stdout, _): Bintool.fetch_tools(bintool.FETCH_ANY, ['_testing'] * 2) self.assertTrue(os.path.exists(dest_fname)) data = tools.ReadFile(dest_fname) self.assertEqual(expected, data) lines = stdout.getvalue().splitlines() self.assertTrue(len(lines) > 2) self.assertEqual('Tools fetched: 1: _testing', lines[-2]) self.assertEqual('Failures: 1: _testing', lines[-1])
def test_fetch_missing(self): """Test fetching missing tools""" # pylint: disable=W0613 def fake_fetch2(method, col, skip_present): """Fakes the Binutils.fetch() function Returns PRESENT only for the '_testing' bintool """ btool = list(self.btools.values())[self.seq] self.seq += 1 print('fetch', btool.name) if btool.name == '_testing': return bintool.PRESENT return bintool.FETCHED # Preload a list of tools to return when get_tool_list() and create() # are called all_tools = Bintool.get_tool_list(True) self.btools = collections.OrderedDict() for name in all_tools: self.btools[name] = Bintool.create(name) self.seq = 0 with unittest.mock.patch.object(bintool.Bintool, 'fetch_tool', side_effect=fake_fetch2): with unittest.mock.patch.object(bintool.Bintool, 'get_tool_list', side_effect=[all_tools]): with unittest.mock.patch.object( bintool.Bintool, 'create', side_effect=self.btools.values()): with test_util.capture_sys_output() as (stdout, _): Bintool.fetch_tools(bintool.FETCH_ANY, ['missing']) lines = stdout.getvalue().splitlines() num_tools = len(self.btools) fetched = [line for line in lines if 'Tools fetched:' in line].pop() present = [line for line in lines if 'Already present:' in line].pop() self.assertIn(f'{num_tools - 1}: ', fetched) self.assertIn('1: ', present)
def check_fetch_all(self, method): """Helper to check the operation of fetching all tools""" # pylint: disable=W0613 def fake_fetch(method, col, skip_present): """Fakes the Binutils.fetch() function Returns FETCHED and FAIL on alternate calls """ self.seq += 1 result = bintool.FETCHED if self.seq & 1 else bintool.FAIL self.count[result] += 1 return result self.seq = 0 self.count = collections.defaultdict(int) with unittest.mock.patch.object(bintool.Bintool, 'fetch_tool', side_effect=fake_fetch): with test_util.capture_sys_output() as (stdout, _): Bintool.fetch_tools(method, ['all']) lines = stdout.getvalue().splitlines() self.assertIn(f'{self.count[bintool.FETCHED]}: ', lines[-2]) self.assertIn(f'{self.count[bintool.FAIL]}: ', lines[-1])