1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
#!/usr/bin/env python
##===-------------- iwyu_tool_test.py - test for iwyu_tool.py -------------===##
#
# The LLVM Compiler Infrastructure
#
# This file is distributed under the University of Illinois Open Source
# License. See LICENSE.TXT for details.
#
##===----------------------------------------------------------------------===##
import time
import random
import unittest
import iwyu_tool
try:
from cStringIO import StringIO
except ImportError:
from io import StringIO
class MockProcess(object):
def __init__(self, block, content):
self.block = block
self.content = content
self.complete_ts = time.time() + block
def poll(self):
if time.time() < self.complete_ts:
return None
return 0
def get_output(self):
self.poll()
return self.content
class MockInvocation(iwyu_tool.Invocation):
def __init__(self, command=None, cwd=''):
iwyu_tool.Invocation.__init__(self, command or [], cwd)
self._will_return = ''
self._will_block = 0
def will_block(self, seconds):
self._will_block = seconds
def will_return(self, content):
self._will_return = content
def start(self, verbose):
if self._will_block > 0:
time.sleep(self._will_block)
return MockProcess(self._will_block, self._will_return)
class IWYUToolTestBase(unittest.TestCase):
def setUp(self):
self.stdout_stub = StringIO()
iwyu_tool.sys.stdout = self.stdout_stub
def _execute(self, invocations, verbose=False, formatter=None, jobs=1):
formatter = formatter or iwyu_tool.DEFAULT_FORMAT
formatter = iwyu_tool.FORMATTERS.get(formatter, formatter)
return iwyu_tool.execute(invocations, verbose, formatter, jobs)
class IWYUToolTests(IWYUToolTestBase):
def test_from_compile_command(self):
iwyu_args = ['-foo']
invocation = iwyu_tool.Invocation.from_compile_command(
{
'directory': '/home/user/llvm/build',
'command': '/usr/bin/clang++ -Iinclude file.cc',
'file': 'file.cc'
}, iwyu_args)
self.assertEqual(
invocation.command,
[iwyu_tool.IWYU_EXECUTABLE, '-foo', '-Iinclude', 'file.cc'])
self.assertEqual(invocation.cwd, '/home/user/llvm/build')
def test_invocation(self):
invocation = MockInvocation()
invocation.will_return('BAR')
self._execute([invocation])
self.assertEqual(self.stdout_stub.getvalue(), 'BAR\n')
def test_order_asynchronous(self):
invocations = [MockInvocation() for _ in range(100)]
for n, invocation in enumerate(invocations):
invocation.will_return('BAR%d' % n)
invocation.will_block(random.random() / 100)
self._execute(invocations, jobs=100)
self.assertSetEqual(
set('BAR%d' % n for n in range(100)),
set(self.stdout_stub.getvalue().splitlines()))
def test_order_synchronous(self):
invocations = [MockInvocation() for _ in range(100)]
for n, invocation in enumerate(invocations):
invocation.will_return('BAR%d' % n)
invocation.will_block(random.random() / 100)
self._execute(invocations, jobs=1)
self.assertEqual(['BAR%d' % n for n in range(100)],
self.stdout_stub.getvalue().splitlines())
if __name__ == '__main__':
unittest.main()
|