diff options
Diffstat (limited to 'python/macholib/macholib_tests/test_command_line.py')
-rw-r--r-- | python/macholib/macholib_tests/test_command_line.py | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/python/macholib/macholib_tests/test_command_line.py b/python/macholib/macholib_tests/test_command_line.py new file mode 100644 index 000000000..a9cfd6f10 --- /dev/null +++ b/python/macholib/macholib_tests/test_command_line.py @@ -0,0 +1,147 @@ +from macholib import macho_dump +from macholib import macho_find +from macholib import _cmdline +from macholib import util + +import sys +import shutil +import os + +if sys.version_info[:2] <= (2,6): + import unittest2 as unittest +else: + import unittest + +try: + from StringIO import StringIO +except ImportError: + from io import StringIO + +class TestCmdLine (unittest.TestCase): + + # This test is no longer valid: + def no_test_main_is_shared(self): + self.assertTrue(macho_dump.main is _cmdline.main) + self.assertTrue(macho_find.main is _cmdline.main) + + def test_check_file(self): + record = [] + def record_cb(fp, path): + record.append((fp, path)) + + self.assertEqual(_cmdline.check_file(sys.stdout, '/bin/sh', record_cb), 0) + self.assertEqual(record, [(sys.stdout, '/bin/sh')]) + + saved_stderr = sys.stderr + saved_argv = sys.argv + try: + sys.stderr = StringIO() + sys.argv = ['macho_test'] + + record[:] = [] + self.assertEqual(_cmdline.check_file(sys.stdout, '/bin/no-shell', record_cb), 1) + self.assertEqual(record, []) + self.assertEqual(sys.stderr.getvalue(), "macho_test: /bin/no-shell: No such file or directory\n") + self.assertEqual(record, []) + + shutil.copy('/bin/sh', 'test.exec') + os.chmod('test.exec', 0) + + sys.stderr = StringIO() + self.assertEqual(_cmdline.check_file(sys.stdout, 'test.exec', record_cb), 1) + self.assertEqual(record, []) + self.assertEqual(sys.stderr.getvalue(), "macho_test: test.exec: [Errno 13] Permission denied: 'test.exec'\n") + self.assertEqual(record, []) + + + finally: + sys.stderr = sys.stderr + sys.argv = saved_argv + if os.path.exists('test.exec'): + os.unlink('test.exec') + + def test_shared_main(self): + + saved_stderr = sys.stderr + saved_argv = sys.argv + try: + sys.stderr = StringIO() + + sys.argv = ['macho_tool'] + + self.assertEqual(_cmdline.main(lambda *args: None), 1) + self.assertEqual(sys.stderr.getvalue(), 'Usage: macho_tool filename...\n') + + names = [] + def record_names(fp, name): + self.assertEqual(fp, sys.stdout) + names.append(name) + + + sys.stderr = StringIO() + sys.argv = ['macho_tool', '/bin/sh'] + self.assertEqual(_cmdline.main(record_names), 0) + self.assertEqual(sys.stderr.getvalue(), '') + self.assertEqual(names, ['/bin/sh']) + + names = [] + sys.stderr = StringIO() + sys.argv = ['macho_tool', '/bin/sh', '/bin/ls'] + self.assertEqual(_cmdline.main(record_names), 0) + self.assertEqual(sys.stderr.getvalue(), '') + self.assertEqual(names, ['/bin/sh', '/bin/ls']) + + names = [] + sys.stderr = StringIO() + sys.argv = ['macho_tool', '/bin'] + self.assertEqual(_cmdline.main(record_names), 0) + self.assertEqual(sys.stderr.getvalue(), '') + names.sort() + dn = '/bin' + real_names = [ + os.path.join(dn, fn) for fn in os.listdir(dn) + if util.is_platform_file(os.path.join(dn, fn)) ] + real_names.sort() + + self.assertEqual(names, real_names) + + finally: + sys.stderr = saved_stderr + sys.argv = saved_argv + + def test_macho_find(self): + fp = StringIO() + macho_find.print_file(fp, "file1") + macho_find.print_file(fp, "file2") + self.assertEqual(fp.getvalue(), "file1\nfile2\n") + + def test_macho_dump(self): + fp = StringIO() + macho_dump.print_file(fp, "/bin/sh") + lines = fp.getvalue().splitlines() + + self.assertEqual(lines[0], "/bin/sh") + self.assertTrue(len(lines) > 3) + + self.assertEqual(lines[-1], '') + del lines[-1] + + idx = 1 + while idx < len(lines): + self.assertTrue(lines[idx].startswith(' [MachOHeader endian')) + idx+=1 + + lc = 0 + while idx < len(lines): + if not lines[idx].startswith('\t'): + break + + lc +=1 + self.assertTrue(os.path.exists(lines[idx].lstrip())) + idx += 1 + + self.assertTrue(lc > 1) + + +if __name__ == "__main__": + unittest.main() |