def test_all_bintools(self): """Test that all bintools can handle all available fetch types""" def handle_download(_): """Take the tools.Download() function by writing a file""" tools.WriteFile(fname, expected) return fname, dirname def fake_run(*cmd): if cmd[0] == 'make': # See Bintool.build_from_git() tmpdir = cmd[2] self.fname = os.path.join(tmpdir, 'pathname') tools.WriteFile(self.fname, b'hello') expected = b'this is a test' dirname = os.path.join(self._indir, 'download_dir') os.mkdir(dirname) fname = os.path.join(dirname, 'downloaded') with unittest.mock.patch.object(tools, 'Run', side_effect=fake_run): with unittest.mock.patch.object(tools, 'Download', side_effect=handle_download): with test_util.capture_sys_output() as _: for name in Bintool.get_tool_list(): btool = Bintool.create(name) for method in range(bintool.FETCH_COUNT): result = btool.fetch(method) self.assertTrue(result is not False) if result is not True and result is not None: result_fname, _ = result self.assertTrue(os.path.exists(result_fname)) data = tools.ReadFile(result_fname) self.assertEqual(expected, data) os.remove(result_fname)
def test_all_bintool_versions(self): """Test handling of bintool version when it cannot be run""" all_tools = Bintool.get_tool_list() for name in all_tools: btool = Bintool.create(name) with unittest.mock.patch.object( btool, 'run_cmd_result', return_value=command.CommandResult()): self.assertEqual('unknown', btool.version())
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 test_tool_list(self): """Test listing available tools""" self.assertGreater(len(Bintool.get_tool_list()), 3)