# -*- 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
from . import make_args, silent_check_call, silent_call, create_empty_file
import unittest
import os.path
import json
class CompilationDatabaseTest(unittest.TestCase):
@staticmethod
def run_intercept(tmpdir, args):
result = os.path.join(tmpdir, "cdb.json")
make = make_args(tmpdir) + args
silent_check_call(["intercept-build", "--cdb", result] + make)
return result
@staticmethod
def count_entries(filename):
with open(filename, "r") as handler:
content = json.load(handler)
return len(content)
def test_successful_build(self):
with libear.TemporaryDirectory() as tmpdir:
result = self.run_intercept(tmpdir, ["build_regular"])
self.assertTrue(os.path.isfile(result))
self.assertEqual(5, self.count_entries(result))
def test_successful_build_with_wrapper(self):
with libear.TemporaryDirectory() as tmpdir:
result = os.path.join(tmpdir, "cdb.json")
make = make_args(tmpdir) + ["build_regular"]
silent_check_call(
["intercept-build", "--cdb", result, "--override-compiler"] + make
)
self.assertTrue(os.path.isfile(result))
self.assertEqual(5, self.count_entries(result))
@unittest.skipIf(os.getenv("TRAVIS"), "ubuntu make return -11")
def test_successful_build_parallel(self):
with libear.TemporaryDirectory() as tmpdir:
result = self.run_intercept(tmpdir, ["-j", "4", "build_regular"])
self.assertTrue(os.path.isfile(result))
self.assertEqual(5, self.count_entries(result))
@unittest.skipIf(os.getenv("TRAVIS"), "ubuntu env remove clang from path")
def test_successful_build_on_empty_env(self):
with libear.TemporaryDirectory() as tmpdir:
result = os.path.join(tmpdir, "cdb.json")
make = make_args(tmpdir) + ["CC=clang", "build_regular"]
silent_check_call(["intercept-build", "--cdb", result, "env", "-"] + make)
self.assertTrue(os.path.isfile(result))
self.assertEqual(5, self.count_entries(result))
def test_successful_build_all_in_one(self):
with libear.TemporaryDirectory() as tmpdir:
result = self.run_intercept(tmpdir, ["build_all_in_one"])
self.assertTrue(os.path.isfile(result))
self.assertEqual(5, self.count_entries(result))
def test_not_successful_build(self):
with libear.TemporaryDirectory() as tmpdir:
result = os.path.join(tmpdir, "cdb.json")
make = make_args(tmpdir) + ["build_broken"]
silent_call(["intercept-build", "--cdb", result] + make)
self.assertTrue(os.path.isfile(result))
self.assertEqual(2, self.count_entries(result))
class ExitCodeTest(unittest.TestCase):
@staticmethod
def run_intercept(tmpdir, target):
result = os.path.join(tmpdir, "cdb.json")
make = make_args(tmpdir) + [target]
return silent_call(["intercept-build", "--cdb", result] + make)
def test_successful_build(self):
with libear.TemporaryDirectory() as tmpdir:
exitcode = self.run_intercept(tmpdir, "build_clean")
self.assertFalse(exitcode)
def test_not_successful_build(self):
with libear.TemporaryDirectory() as tmpdir:
exitcode = self.run_intercept(tmpdir, "build_broken")
self.assertTrue(exitcode)
class ResumeFeatureTest(unittest.TestCase):
@staticmethod
def run_intercept(tmpdir, target, args):
result = os.path.join(tmpdir, "cdb.json")
make = make_args(tmpdir) + [target]
silent_check_call(["intercept-build", "--cdb", result] + args + make)
return result
@staticmethod
def count_entries(filename):
with open(filename, "r") as handler:
content = json.load(handler)
return len(content)
def test_overwrite_existing_cdb(self):
with libear.TemporaryDirectory() as tmpdir:
result = self.run_intercept(tmpdir, "build_clean", [])
self.assertTrue(os.path.isfile(result))
result = self.run_intercept(tmpdir, "build_regular", [])
self.assertTrue(os.path.isfile(result))
self.assertEqual(2, self.count_entries(result))
def test_append_to_existing_cdb(self):
with libear.TemporaryDirectory() as tmpdir:
result = self.run_intercept(tmpdir, "build_clean", [])
self.assertTrue(os.path.isfile(result))
result = self.run_intercept(tmpdir, "build_regular", ["--append"])
self.assertTrue(os.path.isfile(result))
self.assertEqual(5, self.count_entries(result))
class ResultFormattingTest(unittest.TestCase):
@staticmethod
def run_intercept(tmpdir, command):
result = os.path.join(tmpdir, "cdb.json")
silent_check_call(["intercept-build", "--cdb", result] + command, cwd=tmpdir)
with open(result, "r") as handler:
content = json.load(handler)
return content
def assert_creates_number_of_entries(self, command, count):
with libear.TemporaryDirectory() as tmpdir:
filename = os.path.join(tmpdir, "test.c")
create_empty_file(filename)
command.append(filename)
cmd = ["sh", "-c", " ".join(command)]
cdb = self.run_intercept(tmpdir, cmd)
self.assertEqual(count, len(cdb))
def test_filter_preprocessor_only_calls(self):
self.assert_creates_number_of_entries(["cc", "-c"], 1)
self.assert_creates_number_of_entries(["cc", "-c", "-E"], 0)
self.assert_creates_number_of_entries(["cc", "-c", "-M"], 0)
self.assert_creates_number_of_entries(["cc", "-c", "-MM"], 0)
def assert_command_creates_entry(self, command, expected):
with libear.TemporaryDirectory() as tmpdir:
filename = os.path.join(tmpdir, command[-1])
create_empty_file(filename)
cmd = ["sh", "-c", " ".join(command)]
cdb = self.run_intercept(tmpdir, cmd)
self.assertEqual(" ".join(expected), cdb[0]["command"])
def test_filter_preprocessor_flags(self):
self.assert_command_creates_entry(
["cc", "-c", "-MD", "test.c"], ["cc", "-c", "test.c"]
)
self.assert_command_creates_entry(
["cc", "-c", "-MMD", "test.c"], ["cc", "-c", "test.c"]
)
self.assert_command_creates_entry(
["cc", "-c", "-MD", "-MF", "test.d", "test.c"], ["cc", "-c", "test.c"]
)
def test_pass_language_flag(self):
self.assert_command_creates_entry(
["cc", "-c", "-x", "c", "test.c"], ["cc", "-c", "-x", "c", "test.c"]
)
self.assert_command_creates_entry(
["cc", "-c", "test.c"], ["cc", "-c", "test.c"]
)
def test_pass_arch_flags(self):
self.assert_command_creates_entry(
["clang", "-c", "test.c"], ["cc", "-c", "test.c"]
)
self.assert_command_creates_entry(
["clang", "-c", "-arch", "i386", "test.c"],
["cc", "-c", "-arch", "i386", "test.c"],
)
self.assert_command_creates_entry(
["clang", "-c", "-arch", "i386", "-arch", "armv7l", "test.c"],
["cc", "-c", "-arch", "i386", "-arch", "armv7l", "test.c"],
)