Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame^] | 1 | # -*- coding: utf-8 -*- |
| 2 | # The LLVM Compiler Infrastructure |
| 3 | # |
| 4 | # This file is distributed under the University of Illinois Open Source |
| 5 | # License. See LICENSE.TXT for details. |
| 6 | |
| 7 | import libscanbuild.intercept as sut |
| 8 | from . import fixtures |
| 9 | import os.path |
| 10 | |
| 11 | |
| 12 | class InterceptUtilTest(fixtures.TestCase): |
| 13 | |
| 14 | def test_is_compiler_call_filter(self): |
| 15 | def test(command): |
| 16 | return sut.is_compiler_call({'command': [command]}) |
| 17 | |
| 18 | self.assertTrue(test('clang')) |
| 19 | self.assertTrue(test('clang-3.6')) |
| 20 | self.assertTrue(test('clang++')) |
| 21 | self.assertTrue(test('clang++-3.5.1')) |
| 22 | self.assertTrue(test('cc')) |
| 23 | self.assertTrue(test('c++')) |
| 24 | self.assertTrue(test('gcc')) |
| 25 | self.assertTrue(test('g++')) |
| 26 | self.assertTrue(test('/usr/local/bin/gcc')) |
| 27 | self.assertTrue(test('/usr/local/bin/g++')) |
| 28 | self.assertTrue(test('/usr/local/bin/clang')) |
| 29 | self.assertTrue(test('armv7_neno-linux-gnueabi-g++')) |
| 30 | |
| 31 | self.assertFalse(test('')) |
| 32 | self.assertFalse(test('ld')) |
| 33 | self.assertFalse(test('as')) |
| 34 | self.assertFalse(test('/usr/local/bin/compiler')) |
| 35 | |
| 36 | def test_format_entry_filters_action(self): |
| 37 | def test(command): |
| 38 | return list(sut.format_entry( |
| 39 | {'command': command, 'directory': '/opt/src/project'})) |
| 40 | |
| 41 | self.assertTrue(test(['cc', '-c', 'file.c', '-o', 'file.o'])) |
| 42 | self.assertFalse(test(['cc', '-E', 'file.c'])) |
| 43 | self.assertFalse(test(['cc', '-MM', 'file.c'])) |
| 44 | self.assertFalse(test(['cc', 'this.o', 'that.o', '-o', 'a.out'])) |
| 45 | self.assertFalse(test(['cc', '-print-prog-name'])) |
| 46 | |
| 47 | def test_format_entry_normalize_filename(self): |
| 48 | directory = os.path.join(os.sep, 'home', 'me', 'project') |
| 49 | |
| 50 | def test(command): |
| 51 | result = list(sut.format_entry( |
| 52 | {'command': command, 'directory': directory})) |
| 53 | return result[0]['file'] |
| 54 | |
| 55 | self.assertEqual(test(['cc', '-c', 'file.c']), |
| 56 | os.path.join(directory, 'file.c')) |
| 57 | self.assertEqual(test(['cc', '-c', './file.c']), |
| 58 | os.path.join(directory, 'file.c')) |
| 59 | self.assertEqual(test(['cc', '-c', '../file.c']), |
| 60 | os.path.join(os.path.dirname(directory), 'file.c')) |
| 61 | self.assertEqual(test(['cc', '-c', '/opt/file.c']), |
| 62 | '/opt/file.c') |
| 63 | |
| 64 | def test_sip(self): |
| 65 | def create_status_report(filename, message): |
| 66 | content = """#!/usr/bin/env sh |
| 67 | echo 'sa-la-la-la' |
| 68 | echo 'la-la-la' |
| 69 | echo '{0}' |
| 70 | echo 'sa-la-la-la' |
| 71 | echo 'la-la-la' |
| 72 | """.format(message) |
| 73 | lines = [line.strip() for line in content.split('\n')] |
| 74 | with open(filename, 'w') as handle: |
| 75 | handle.write('\n'.join(lines)) |
| 76 | handle.close() |
| 77 | os.chmod(filename, 0x1ff) |
| 78 | |
| 79 | def create_csrutil(dest_dir, status): |
| 80 | filename = os.path.join(dest_dir, 'csrutil') |
| 81 | message = 'System Integrity Protection status: {0}'.format(status) |
| 82 | return create_status_report(filename, message) |
| 83 | |
| 84 | def create_sestatus(dest_dir, status): |
| 85 | filename = os.path.join(dest_dir, 'sestatus') |
| 86 | message = 'SELinux status:\t{0}'.format(status) |
| 87 | return create_status_report(filename, message) |
| 88 | |
| 89 | ENABLED = 'enabled' |
| 90 | DISABLED = 'disabled' |
| 91 | |
| 92 | OSX = 'darwin' |
| 93 | LINUX = 'linux' |
| 94 | |
| 95 | with fixtures.TempDir() as tmpdir: |
| 96 | try: |
| 97 | saved = os.environ['PATH'] |
| 98 | os.environ['PATH'] = tmpdir + ':' + saved |
| 99 | |
| 100 | create_csrutil(tmpdir, ENABLED) |
| 101 | self.assertTrue(sut.is_preload_disabled(OSX)) |
| 102 | |
| 103 | create_csrutil(tmpdir, DISABLED) |
| 104 | self.assertFalse(sut.is_preload_disabled(OSX)) |
| 105 | |
| 106 | create_sestatus(tmpdir, ENABLED) |
| 107 | self.assertTrue(sut.is_preload_disabled(LINUX)) |
| 108 | |
| 109 | create_sestatus(tmpdir, DISABLED) |
| 110 | self.assertFalse(sut.is_preload_disabled(LINUX)) |
| 111 | finally: |
| 112 | os.environ['PATH'] = saved |
| 113 | |
| 114 | try: |
| 115 | saved = os.environ['PATH'] |
| 116 | os.environ['PATH'] = '' |
| 117 | # shall be false when it's not in the path |
| 118 | self.assertFalse(sut.is_preload_disabled(OSX)) |
| 119 | self.assertFalse(sut.is_preload_disabled(LINUX)) |
| 120 | |
| 121 | self.assertFalse(sut.is_preload_disabled('unix')) |
| 122 | finally: |
| 123 | os.environ['PATH'] = saved |