Skip to content

Commit f28aeae

Browse files
authored
test/cli/other_test.py: extracted lookup-related tests to separate file (danmar#7543)
1 parent 69f7241 commit f28aeae

File tree

2 files changed

+337
-333
lines changed

2 files changed

+337
-333
lines changed

test/cli/lookup_test.py

Lines changed: 336 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,336 @@
1+
import os
2+
import sys
3+
import pytest
4+
5+
from testutils import cppcheck_ex, cppcheck
6+
7+
def __remove_std_lookup_log(l : list, exepath):
8+
l.remove("looking for library 'std.cfg'")
9+
l.remove("looking for library '{}/std.cfg'".format(exepath))
10+
l.remove("looking for library '{}/cfg/std.cfg'".format(exepath))
11+
return l
12+
13+
14+
# TODO: test with FILESDIR
15+
def test_lib_lookup(tmpdir):
16+
test_file = os.path.join(tmpdir, 'test.c')
17+
with open(test_file, 'wt'):
18+
pass
19+
20+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=library', '--library=gnu', test_file])
21+
exepath = os.path.dirname(exe)
22+
if sys.platform == 'win32':
23+
exepath = exepath.replace('\\', '/')
24+
assert exitcode == 0, stdout if stdout else stderr
25+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
26+
assert lines == [
27+
"looking for library 'gnu'",
28+
"looking for library 'gnu.cfg'",
29+
"looking for library '{}/gnu.cfg'".format(exepath),
30+
"looking for library '{}/cfg/gnu.cfg'".format(exepath),
31+
'Checking {} ...'.format(test_file)
32+
]
33+
34+
35+
# TODO: test with FILESDIR
36+
def test_lib_lookup_notfound(tmpdir):
37+
test_file = os.path.join(tmpdir, 'test.c')
38+
with open(test_file, 'wt'):
39+
pass
40+
41+
exitcode, stdout, _, exe = cppcheck_ex(['--debug-lookup=library', '--library=none', test_file])
42+
exepath = os.path.dirname(exe)
43+
if sys.platform == 'win32':
44+
exepath = exepath.replace('\\', '/')
45+
assert exitcode == 1, stdout
46+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
47+
assert lines == [
48+
# TODO: specify which folder is actually used for lookup here
49+
"looking for library 'none'", # TODO: this could conflict with the platform lookup
50+
"looking for library 'none.cfg'",
51+
# TODO: lookup of '{exepath}/none' missing - could conflict with the platform lookup though
52+
"looking for library '{}/none.cfg'".format(exepath),
53+
# TODO: lookup of '{exepath}/cfg/none' missing
54+
"looking for library '{}/cfg/none.cfg'".format(exepath),
55+
"library not found: 'none'",
56+
"cppcheck: Failed to load library configuration file 'none'. File not found"
57+
]
58+
59+
60+
def test_lib_lookup_absolute(tmpdir):
61+
test_file = os.path.join(tmpdir, 'test.c')
62+
with open(test_file, 'wt'):
63+
pass
64+
65+
cfg_file = os.path.join(tmpdir, 'test.cfg')
66+
with open(cfg_file, 'wt') as f:
67+
f.write('''
68+
<?xml version="1.0"?>
69+
<def format="2">
70+
</def>
71+
''')
72+
73+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=library', '--library={}'.format(cfg_file), test_file])
74+
exepath = os.path.dirname(exe)
75+
if sys.platform == 'win32':
76+
exepath = exepath.replace('\\', '/')
77+
assert exitcode == 0, stdout if stdout else stderr
78+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
79+
assert lines == [
80+
"looking for library '{}'".format(cfg_file),
81+
'Checking {} ...'.format(test_file)
82+
]
83+
84+
85+
def test_lib_lookup_absolute_notfound(tmpdir):
86+
test_file = os.path.join(tmpdir, 'test.c')
87+
with open(test_file, 'wt'):
88+
pass
89+
90+
cfg_file = os.path.join(tmpdir, 'test.cfg')
91+
92+
exitcode, stdout, _, exe = cppcheck_ex(['--debug-lookup=library', '--library={}'.format(cfg_file), test_file])
93+
exepath = os.path.dirname(exe)
94+
if sys.platform == 'win32':
95+
exepath = exepath.replace('\\', '/')
96+
assert exitcode == 1, stdout
97+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
98+
assert lines == [
99+
"looking for library '{}'".format(cfg_file),
100+
"library not found: '{}'".format(cfg_file),
101+
"cppcheck: Failed to load library configuration file '{}'. File not found".format(cfg_file)
102+
]
103+
104+
105+
def test_lib_lookup_nofile(tmpdir):
106+
test_file = os.path.join(tmpdir, 'test.c')
107+
with open(test_file, 'wt'):
108+
pass
109+
110+
# make sure we do not produce an error when the attempted lookup path is a directory and not a file
111+
gtk_dir = os.path.join(tmpdir, 'gtk')
112+
os.mkdir(gtk_dir)
113+
gtk_cfg_dir = os.path.join(tmpdir, 'gtk.cfg')
114+
os.mkdir(gtk_cfg_dir)
115+
116+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=library', '--library=gtk', test_file], cwd=tmpdir)
117+
exepath = os.path.dirname(exe)
118+
if sys.platform == 'win32':
119+
exepath = exepath.replace('\\', '/')
120+
assert exitcode == 0, stdout if stdout else stderr
121+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
122+
assert lines == [
123+
"looking for library 'gtk'",
124+
"looking for library 'gtk.cfg'",
125+
"looking for library '{}/gtk.cfg'".format(exepath),
126+
"looking for library '{}/cfg/gtk.cfg'".format(exepath),
127+
'Checking {} ...'.format(test_file)
128+
]
129+
130+
131+
def test_lib_lookup_multi(tmpdir):
132+
test_file = os.path.join(tmpdir, 'test.c')
133+
with open(test_file, 'wt'):
134+
pass
135+
136+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=library', '--library=posix,gnu', test_file])
137+
exepath = os.path.dirname(exe)
138+
if sys.platform == 'win32':
139+
exepath = exepath.replace('\\', '/')
140+
assert exitcode == 0, stdout if stdout else stderr
141+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
142+
assert lines == [
143+
"looking for library 'posix'",
144+
"looking for library 'posix.cfg'",
145+
"looking for library '{}/posix.cfg'".format(exepath),
146+
"looking for library '{}/cfg/posix.cfg'".format(exepath),
147+
"looking for library 'gnu'",
148+
"looking for library 'gnu.cfg'",
149+
"looking for library '{}/gnu.cfg'".format(exepath),
150+
"looking for library '{}/cfg/gnu.cfg'".format(exepath),
151+
'Checking {} ...'.format(test_file)
152+
]
153+
154+
155+
def test_platform_lookup_builtin(tmpdir):
156+
test_file = os.path.join(tmpdir, 'test.c')
157+
with open(test_file, 'wt'):
158+
pass
159+
160+
exitcode, stdout, stderr = cppcheck(['--debug-lookup=platform', '--platform=unix64', test_file])
161+
assert exitcode == 0, stdout if stdout else stderr
162+
lines = stdout.splitlines()
163+
# built-in platform are not being looked up
164+
assert lines == [
165+
'Checking {} ...'.format(test_file)
166+
]
167+
168+
169+
# TODO: behaves differently when using a CMake build
170+
# TODO: test with FILESDIR
171+
@pytest.mark.skip
172+
def test_platform_lookup_external(tmpdir):
173+
test_file = os.path.join(tmpdir, 'test.c')
174+
with open(test_file, 'wt'):
175+
pass
176+
177+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=platform', '--platform=avr8', test_file])
178+
exepath = os.path.dirname(exe)
179+
if sys.platform == 'win32':
180+
exepath = exepath.replace('\\', '/')
181+
assert exitcode == 0, stdout if stdout else stderr
182+
lines = stdout.splitlines()
183+
assert lines == [
184+
"looking for platform 'avr8' in '{}'".format(os.path.join(exepath, 'cppcheck')), # TODO: this not not the path *of* the executable but the the path *to* the executable
185+
"try to load platform file 'avr8' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=avr8",
186+
"try to load platform file 'avr8.xml' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=avr8.xml",
187+
"try to load platform file 'platforms/avr8' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=platforms/avr8",
188+
"try to load platform file 'platforms/avr8.xml' ... Success",
189+
'Checking {} ...'.format(test_file)
190+
]
191+
192+
193+
# TODO: test with FILESDIR
194+
def test_platform_lookup_external_notfound(tmpdir):
195+
test_file = os.path.join(tmpdir, 'test.c')
196+
with open(test_file, 'wt'):
197+
pass
198+
199+
exitcode, stdout, _, exe = cppcheck_ex(['--debug-lookup=platform', '--platform=none', test_file])
200+
exepath = os.path.dirname(exe)
201+
exepath_bin = os.path.join(exepath, 'cppcheck')
202+
if sys.platform == 'win32':
203+
exepath = exepath.replace('\\', '/')
204+
exepath_bin += '.exe'
205+
assert exitcode == 1, stdout
206+
lines = stdout.splitlines()
207+
assert lines == [
208+
"looking for platform 'none' in '{}'".format(exepath_bin), # TODO: this is not the path *of* the executable but the the path *to* the executable
209+
"try to load platform file 'none' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=none",
210+
"try to load platform file 'none.xml' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=none.xml",
211+
"try to load platform file 'platforms/none' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=platforms/none",
212+
"try to load platform file 'platforms/none.xml' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename=platforms/none.xml",
213+
"try to load platform file '{}/none' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename={}/none".format(exepath, exepath),
214+
# TODO: lookup of '{exepath}/none.xml' missing
215+
"try to load platform file '{}/platforms/none' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename={}/platforms/none".format(exepath, exepath),
216+
"try to load platform file '{}/platforms/none.xml' ... Error=XML_ERROR_FILE_NOT_FOUND ErrorID=3 (0x3) Line number=0: filename={}/platforms/none.xml".format(exepath, exepath),
217+
"cppcheck: error: unrecognized platform: 'none'."
218+
]
219+
220+
221+
# TODO: test with FILESDIR
222+
def test_addon_lookup(tmpdir):
223+
test_file = os.path.join(tmpdir, 'test.c')
224+
with open(test_file, 'wt'):
225+
pass
226+
227+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=addon', '--addon=misra', test_file])
228+
exepath = os.path.dirname(exe)
229+
exepath_sep = exepath + os.path.sep
230+
assert exitcode == 0, stdout if stdout else stderr
231+
lines = stdout.splitlines()
232+
assert lines == [
233+
"looking for addon 'misra.py'",
234+
"looking for addon '{}misra.py'".format(exepath_sep),
235+
"looking for addon '{}addons/misra.py'".format(exepath_sep), # TODO: mixed separators
236+
'Checking {} ...'.format(test_file)
237+
]
238+
239+
240+
# TODO: test with FILESDIR
241+
def test_addon_lookup_ext(tmpdir):
242+
test_file = os.path.join(tmpdir, 'test.c')
243+
with open(test_file, 'wt'):
244+
pass
245+
246+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=addon', '--addon=misra.py', test_file])
247+
exepath = os.path.dirname(exe)
248+
exepath_sep = exepath + os.path.sep
249+
assert exitcode == 0, stdout if stdout else stderr
250+
lines = stdout.splitlines()
251+
assert lines == [
252+
"looking for addon 'misra.py'",
253+
"looking for addon '{}misra.py'".format(exepath_sep),
254+
"looking for addon '{}addons/misra.py'".format(exepath_sep), # TODO: mixed separators
255+
'Checking {} ...'.format(test_file)
256+
]
257+
258+
259+
# TODO: test with FILESDIR
260+
def test_addon_lookup_notfound(tmpdir):
261+
test_file = os.path.join(tmpdir, 'test.c')
262+
with open(test_file, 'wt'):
263+
pass
264+
265+
exitcode, stdout, _, exe = cppcheck_ex(['--debug-lookup=addon', '--addon=none', test_file])
266+
exepath = os.path.dirname(exe)
267+
exepath_sep = exepath + os.path.sep
268+
assert exitcode == 1, stdout
269+
lines = stdout.splitlines()
270+
assert lines == [
271+
"looking for addon 'none.py'",
272+
"looking for addon '{}none.py'".format(exepath_sep),
273+
"looking for addon '{}addons/none.py'".format(exepath_sep), # TODO: mixed separators
274+
'Did not find addon none.py'
275+
]
276+
277+
278+
# TODO: test with FILESDIR
279+
def test_addon_lookup_ext_notfound(tmpdir):
280+
test_file = os.path.join(tmpdir, 'test.c')
281+
with open(test_file, 'wt'):
282+
pass
283+
284+
exitcode, stdout, _, exe = cppcheck_ex(['--debug-lookup=addon', '--addon=none.py', test_file])
285+
exepath = os.path.dirname(exe)
286+
exepath_sep = exepath + os.path.sep
287+
assert exitcode == 1, stdout
288+
lines = stdout.splitlines()
289+
assert lines == [
290+
"looking for addon 'none.py'",
291+
"looking for addon '{}none.py'".format(exepath_sep),
292+
"looking for addon '{}addons/none.py'".format(exepath_sep), # TODO: mixed separators
293+
'Did not find addon none.py'
294+
]
295+
296+
297+
# TODO: test with FILESDIR
298+
@pytest.mark.skip
299+
def test_config_lookup(tmpdir):
300+
test_file = os.path.join(tmpdir, 'test.c')
301+
with open(test_file, 'wt'):
302+
pass
303+
304+
# TODO: needs to be in exepath so this is found
305+
config_file = os.path.join(tmpdir, 'cppcheck.cfg')
306+
with open(config_file, 'wt'):
307+
pass
308+
309+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=config', '--addon=misra', test_file], cwd=tmpdir)
310+
exepath = os.path.dirname(exe)
311+
exepath_sep = exepath + os.path.sep
312+
assert exitcode == 0, stdout if stdout else stderr
313+
lines = stdout.splitlines()
314+
assert lines == [
315+
"looking for '{}cppcheck.cfg'".format(exepath_sep),
316+
'no configuration found',
317+
'Checking {} ...'.format(test_file)
318+
]
319+
320+
321+
# TODO: test with FILESDIR
322+
def test_config_lookup_notfound(tmpdir):
323+
test_file = os.path.join(tmpdir, 'test.c')
324+
with open(test_file, 'wt'):
325+
pass
326+
327+
exitcode, stdout, stderr, exe = cppcheck_ex(['--debug-lookup=config', test_file])
328+
exepath = os.path.dirname(exe)
329+
exepath_sep = exepath + os.path.sep
330+
assert exitcode == 0, stdout if stdout else stderr
331+
lines = stdout.splitlines()
332+
assert lines == [
333+
"looking for '{}cppcheck.cfg'".format(exepath_sep),
334+
'no configuration found',
335+
'Checking {} ...'.format(test_file)
336+
]

0 commit comments

Comments
 (0)