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 | |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 7 | import libear |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 8 | import libscanbuild.intercept as sut |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 9 | import unittest |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 10 | import os.path |
| 11 | |
| 12 | |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 13 | class InterceptUtilTest(unittest.TestCase): |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 14 | |
| 15 | def test_format_entry_filters_action(self): |
| 16 | def test(command): |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 17 | trace = {'command': command, 'directory': '/opt/src/project'} |
| 18 | return list(sut.format_entry(trace)) |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 19 | |
| 20 | self.assertTrue(test(['cc', '-c', 'file.c', '-o', 'file.o'])) |
| 21 | self.assertFalse(test(['cc', '-E', 'file.c'])) |
| 22 | self.assertFalse(test(['cc', '-MM', 'file.c'])) |
| 23 | self.assertFalse(test(['cc', 'this.o', 'that.o', '-o', 'a.out'])) |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 24 | |
| 25 | def test_format_entry_normalize_filename(self): |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 26 | parent = os.path.join(os.sep, 'home', 'me') |
| 27 | current = os.path.join(parent, 'project') |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 28 | |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 29 | def test(filename): |
| 30 | trace = {'directory': current, 'command': ['cc', '-c', filename]} |
| 31 | return list(sut.format_entry(trace))[0]['file'] |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 32 | |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 33 | self.assertEqual(os.path.join(current, 'file.c'), test('file.c')) |
| 34 | self.assertEqual(os.path.join(current, 'file.c'), test('./file.c')) |
| 35 | self.assertEqual(os.path.join(parent, 'file.c'), test('../file.c')) |
| 36 | self.assertEqual(os.path.join(current, 'file.c'), |
| 37 | test(os.path.join(current, 'file.c'))) |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 38 | |
| 39 | def test_sip(self): |
| 40 | def create_status_report(filename, message): |
| 41 | content = """#!/usr/bin/env sh |
| 42 | echo 'sa-la-la-la' |
| 43 | echo 'la-la-la' |
| 44 | echo '{0}' |
| 45 | echo 'sa-la-la-la' |
| 46 | echo 'la-la-la' |
| 47 | """.format(message) |
| 48 | lines = [line.strip() for line in content.split('\n')] |
| 49 | with open(filename, 'w') as handle: |
| 50 | handle.write('\n'.join(lines)) |
| 51 | handle.close() |
| 52 | os.chmod(filename, 0x1ff) |
| 53 | |
| 54 | def create_csrutil(dest_dir, status): |
| 55 | filename = os.path.join(dest_dir, 'csrutil') |
| 56 | message = 'System Integrity Protection status: {0}'.format(status) |
| 57 | return create_status_report(filename, message) |
| 58 | |
| 59 | def create_sestatus(dest_dir, status): |
| 60 | filename = os.path.join(dest_dir, 'sestatus') |
| 61 | message = 'SELinux status:\t{0}'.format(status) |
| 62 | return create_status_report(filename, message) |
| 63 | |
| 64 | ENABLED = 'enabled' |
| 65 | DISABLED = 'disabled' |
| 66 | |
| 67 | OSX = 'darwin' |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 68 | |
Laszlo Nagy | 8bd63e5 | 2016-04-19 12:03:03 +0000 | [diff] [blame] | 69 | with libear.TemporaryDirectory() as tmpdir: |
Laszlo Nagy | 46fc18a | 2017-01-28 22:48:26 +0000 | [diff] [blame^] | 70 | saved = os.environ['PATH'] |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 71 | try: |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 72 | os.environ['PATH'] = tmpdir + ':' + saved |
| 73 | |
| 74 | create_csrutil(tmpdir, ENABLED) |
| 75 | self.assertTrue(sut.is_preload_disabled(OSX)) |
| 76 | |
| 77 | create_csrutil(tmpdir, DISABLED) |
| 78 | self.assertFalse(sut.is_preload_disabled(OSX)) |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 79 | finally: |
| 80 | os.environ['PATH'] = saved |
| 81 | |
Laszlo Nagy | 46fc18a | 2017-01-28 22:48:26 +0000 | [diff] [blame^] | 82 | saved = os.environ['PATH'] |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 83 | try: |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 84 | os.environ['PATH'] = '' |
| 85 | # shall be false when it's not in the path |
| 86 | self.assertFalse(sut.is_preload_disabled(OSX)) |
Laszlo Nagy | bc68758 | 2016-01-12 22:38:41 +0000 | [diff] [blame] | 87 | |
| 88 | self.assertFalse(sut.is_preload_disabled('unix')) |
| 89 | finally: |
| 90 | os.environ['PATH'] = saved |