| # -*- coding: utf-8 -*- |
| # Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| # See https://llvm.org/LICENSE.txt for license information. |
| # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| |
| import libear |
| import libscanbuild.intercept as sut |
| import unittest |
| import os.path |
| |
| |
| class InterceptUtilTest(unittest.TestCase): |
| def test_format_entry_filters_action(self): |
| def test(command): |
| trace = {"command": command, "directory": "/opt/src/project"} |
| return list(sut.format_entry(trace)) |
| |
| self.assertTrue(test(["cc", "-c", "file.c", "-o", "file.o"])) |
| self.assertFalse(test(["cc", "-E", "file.c"])) |
| self.assertFalse(test(["cc", "-MM", "file.c"])) |
| self.assertFalse(test(["cc", "this.o", "that.o", "-o", "a.out"])) |
| |
| def test_format_entry_normalize_filename(self): |
| parent = os.path.join(os.sep, "home", "me") |
| current = os.path.join(parent, "project") |
| |
| def test(filename): |
| trace = {"directory": current, "command": ["cc", "-c", filename]} |
| return list(sut.format_entry(trace))[0]["file"] |
| |
| self.assertEqual(os.path.join(current, "file.c"), test("file.c")) |
| self.assertEqual(os.path.join(current, "file.c"), test("./file.c")) |
| self.assertEqual(os.path.join(parent, "file.c"), test("../file.c")) |
| self.assertEqual( |
| os.path.join(current, "file.c"), test(os.path.join(current, "file.c")) |
| ) |
| |
| def test_sip(self): |
| def create_status_report(filename, message): |
| content = """#!/usr/bin/env sh |
| echo 'sa-la-la-la' |
| echo 'la-la-la' |
| echo '{0}' |
| echo 'sa-la-la-la' |
| echo 'la-la-la' |
| """.format( |
| message |
| ) |
| lines = [line.strip() for line in content.split("\n")] |
| with open(filename, "w") as handle: |
| handle.write("\n".join(lines)) |
| handle.close() |
| os.chmod(filename, 0x1FF) |
| |
| def create_csrutil(dest_dir, status): |
| filename = os.path.join(dest_dir, "csrutil") |
| message = "System Integrity Protection status: {0}".format(status) |
| return create_status_report(filename, message) |
| |
| def create_sestatus(dest_dir, status): |
| filename = os.path.join(dest_dir, "sestatus") |
| message = "SELinux status:\t{0}".format(status) |
| return create_status_report(filename, message) |
| |
| ENABLED = "enabled" |
| DISABLED = "disabled" |
| |
| OSX = "darwin" |
| |
| with libear.TemporaryDirectory() as tmpdir: |
| saved = os.environ["PATH"] |
| try: |
| os.environ["PATH"] = tmpdir + ":" + saved |
| |
| create_csrutil(tmpdir, ENABLED) |
| self.assertTrue(sut.is_preload_disabled(OSX)) |
| |
| create_csrutil(tmpdir, DISABLED) |
| self.assertFalse(sut.is_preload_disabled(OSX)) |
| finally: |
| os.environ["PATH"] = saved |
| |
| saved = os.environ["PATH"] |
| try: |
| os.environ["PATH"] = "" |
| # shall be false when it's not in the path |
| self.assertFalse(sut.is_preload_disabled(OSX)) |
| |
| self.assertFalse(sut.is_preload_disabled("unix")) |
| finally: |
| os.environ["PATH"] = saved |