191 lines
7.6 KiB
Python
191 lines
7.6 KiB
Python
# -*- 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 ResultFormatingTest(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'])
|