Skip to content

Commit 9a3a477

Browse files
authored
fixed #13461 - test/cli/proj2_test.py: use temporary folders to run tests (danmar#7147)
fixes potential issues when tests are run in parallel
1 parent 1fb14d6 commit 9a3a477

File tree

2 files changed

+76
-58
lines changed

2 files changed

+76
-58
lines changed

.gitignore

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,9 @@ stage
9191
/.run
9292

9393
# clang tooling temporary files
94-
.clangd/
95-
.cache/
96-
compile_commands.json
94+
/.clangd/
95+
/.cache/
96+
/compile_commands.json
9797

9898
#vs code
9999
/.vscode

test/cli/proj2_test.py

Lines changed: 73 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import json
55
import os
6+
import shutil
67
from testutils import create_gui_project_file, cppcheck
78

89
__script_dir = os.path.dirname(os.path.abspath(__file__))
@@ -17,10 +18,11 @@
1718
'x = 3 / 0;\n' +
1819
' ^\n') % os.path.join('b', 'b.c')
1920

20-
def __create_compile_commands():
21-
j = [{'directory': os.path.join(__proj_dir, 'a'), 'command': 'gcc -c a.c', 'file': 'a.c'},
22-
{'directory': __proj_dir, 'command': 'gcc -c b/b.c', 'file': 'b/b.c'}]
23-
with open(os.path.join(__proj_dir, __COMPILE_COMMANDS_JSON), 'wt') as f:
21+
def __create_compile_commands(proj_dir):
22+
proj_dir = str(proj_dir)
23+
j = [{'directory': os.path.join(proj_dir, 'a'), 'command': 'gcc -c a.c', 'file': 'a.c'},
24+
{'directory': proj_dir, 'command': 'gcc -c b/b.c', 'file': 'b/b.c'}]
25+
with open(os.path.join(proj_dir, __COMPILE_COMMANDS_JSON), 'wt') as f:
2426
f.write(json.dumps(j))
2527

2628

@@ -34,74 +36,87 @@ def test_file_filter():
3436
assert ret == 0, stdout
3537
assert stdout.find('Checking %s ...' % file2) >= 0
3638

37-
def test_local_path():
38-
__create_compile_commands()
39-
ret, stdout, _ = cppcheck(['--project=compile_commands.json'], cwd=__proj_dir)
39+
def test_local_path(tmp_path):
40+
proj_dir = tmp_path / 'proj2'
41+
shutil.copytree(__proj_dir, proj_dir)
42+
__create_compile_commands(proj_dir)
43+
ret, stdout, _ = cppcheck(['--project=compile_commands.json'], cwd=proj_dir)
4044
file1 = os.path.join('a', 'a.c')
4145
file2 = os.path.join('b', 'b.c')
4246
assert ret == 0, stdout
4347
assert stdout.find('Checking %s ...' % file1) >= 0
4448
assert stdout.find('Checking %s ...' % file2) >= 0
4549

46-
def test_local_path_force():
47-
__create_compile_commands()
48-
ret, stdout, _ = cppcheck(['--project=compile_commands.json', '--force'], cwd=__proj_dir)
50+
def test_local_path_force(tmp_path):
51+
proj_dir = tmp_path / 'proj2'
52+
shutil.copytree(__proj_dir, proj_dir)
53+
__create_compile_commands(proj_dir)
54+
ret, stdout, _ = cppcheck(['--project=compile_commands.json', '--force'], cwd=proj_dir)
4955
assert ret == 0, stdout
5056
assert stdout.find('AAA') >= 0
5157

52-
def test_local_path_maxconfigs():
53-
__create_compile_commands()
54-
ret, stdout, _ = cppcheck(['--project=compile_commands.json', '--max-configs=2'], cwd=__proj_dir)
58+
def test_local_path_maxconfigs(tmp_path):
59+
proj_dir = tmp_path / 'proj2'
60+
shutil.copytree(__proj_dir, proj_dir)
61+
__create_compile_commands(proj_dir)
62+
ret, stdout, _ = cppcheck(['--project=compile_commands.json', '--max-configs=2'], cwd=proj_dir)
5563
assert ret == 0, stdout
5664
assert stdout.find('AAA') >= 0
5765

58-
def test_relative_path():
59-
__create_compile_commands()
60-
ret, stdout, _ = cppcheck(['--project=proj2/' + __COMPILE_COMMANDS_JSON], cwd=__script_dir)
66+
def test_relative_path(tmp_path):
67+
proj_dir = tmp_path / 'proj2'
68+
shutil.copytree(__proj_dir, proj_dir)
69+
__create_compile_commands(proj_dir)
70+
ret, stdout, _ = cppcheck(['--project=proj2/' + __COMPILE_COMMANDS_JSON], cwd=tmp_path)
6171
file1 = os.path.join('proj2', 'a', 'a.c')
6272
file2 = os.path.join('proj2', 'b', 'b.c')
6373
assert ret == 0, stdout
6474
assert stdout.find('Checking %s ...' % file1) >= 0
6575
assert stdout.find('Checking %s ...' % file2) >= 0
6676

67-
def test_absolute_path():
68-
__create_compile_commands()
69-
ret, stdout, _ = cppcheck(['--project=' + os.path.join(__proj_dir, __COMPILE_COMMANDS_JSON)], cwd=__script_dir)
70-
file1 = os.path.join(__proj_dir, 'a', 'a.c')
71-
file2 = os.path.join(__proj_dir, 'b', 'b.c')
77+
def test_absolute_path(tmp_path):
78+
proj_dir = tmp_path / 'proj2'
79+
shutil.copytree(__proj_dir, proj_dir)
80+
__create_compile_commands(proj_dir)
81+
ret, stdout, _ = cppcheck(['--project=' + os.path.join(proj_dir, __COMPILE_COMMANDS_JSON)], cwd=tmp_path)
82+
file1 = os.path.join(proj_dir, 'a', 'a.c')
83+
file2 = os.path.join(proj_dir, 'b', 'b.c')
7284
assert ret == 0, stdout
7385
assert stdout.find('Checking %s ...' % file1) >= 0
7486
assert stdout.find('Checking %s ...' % file2) >= 0
7587

76-
def test_gui_project_loads_compile_commands_1():
77-
__create_compile_commands()
78-
ret, stdout, _ = cppcheck(['--project=proj2/proj2.cppcheck'], cwd=__script_dir)
88+
def test_gui_project_loads_compile_commands_1(tmp_path):
89+
proj_dir = tmp_path / 'proj2'
90+
shutil.copytree(__proj_dir, proj_dir)
91+
__create_compile_commands(proj_dir)
92+
ret, stdout, _ = cppcheck(['--project=proj2/proj2.cppcheck'], cwd=tmp_path)
7993
file1 = os.path.join('proj2', 'a', 'a.c')
8094
file2 = os.path.join('proj2', 'b', 'b.c')
8195
assert ret == 0, stdout
8296
assert stdout.find('Checking %s ...' % file1) >= 0
8397
assert stdout.find('Checking %s ...' % file2) >= 0
8498

85-
def test_gui_project_loads_compile_commands_2():
86-
__create_compile_commands()
99+
def test_gui_project_loads_compile_commands_2(tmp_path):
100+
proj_dir = tmp_path / 'proj2'
101+
shutil.copytree(__proj_dir, proj_dir)
102+
__create_compile_commands(proj_dir)
87103
exclude_path_1 = 'proj2/b'
88-
# TODO: generate in temporary folder
89-
create_gui_project_file(os.path.join(__proj_dir, 'test.cppcheck'),
104+
create_gui_project_file(os.path.join(proj_dir, 'test.cppcheck'),
90105
import_project='compile_commands.json',
91106
exclude_paths=[exclude_path_1])
92-
ret, stdout, _ = cppcheck(['--project=' + os.path.join('proj2','test.cppcheck')], cwd=__script_dir)
93-
os.remove(os.path.join(__proj_dir, 'test.cppcheck')) # TODO: do not remove explicitly
107+
ret, stdout, _ = cppcheck(['--project=' + os.path.join('proj2','test.cppcheck')], cwd=tmp_path)
94108
file1 = os.path.join('proj2', 'a', 'a.c')
95109
file2 = os.path.join('proj2', 'b', 'b.c') # Excluded by test.cppcheck
96110
assert ret == 0, stdout
97111
assert stdout.find('Checking %s ...' % file1) >= 0
98112
assert stdout.find('Checking %s ...' % file2) < 0
99113

100114

101-
def test_gui_project_loads_relative_vs_solution():
102-
create_gui_project_file(os.path.join(__script_dir, 'test.cppcheck'), import_project='proj2/proj2.sln') # TODO: generate in temporary folder
103-
ret, stdout, _ = cppcheck(['--project=test.cppcheck'], cwd=__script_dir)
104-
os.remove(os.path.join(__script_dir, 'test.cppcheck')) # TODO: do not remove explicitly
115+
def test_gui_project_loads_relative_vs_solution(tmp_path):
116+
proj_dir = tmp_path / 'proj2'
117+
shutil.copytree(__proj_dir, proj_dir)
118+
create_gui_project_file(os.path.join(tmp_path, 'test.cppcheck'), import_project='proj2/proj2.sln')
119+
ret, stdout, _ = cppcheck(['--project=test.cppcheck'], cwd=tmp_path)
105120
file1 = os.path.join('proj2', 'a', 'a.c')
106121
file2 = os.path.join('proj2', 'b', 'b.c')
107122
assert ret == 0, stdout
@@ -114,12 +129,13 @@ def test_gui_project_loads_relative_vs_solution():
114129
assert stdout.find('Checking %s Release|Win32...' % file2) >= 0
115130
assert stdout.find('Checking %s Release|x64...' % file2) >= 0
116131

117-
def test_gui_project_loads_absolute_vs_solution():
118-
create_gui_project_file(os.path.join(__script_dir, 'test.cppcheck'), import_project=os.path.join(__proj_dir, 'proj2.sln')) # TODO: generate in temporary folder
119-
ret, stdout, _ = cppcheck(['--project=test.cppcheck'], cwd=__script_dir)
120-
os.remove(os.path.join(__script_dir, 'test.cppcheck')) # TODO: do not remove explicitly
121-
file1 = os.path.join(__proj_dir, 'a', 'a.c')
122-
file2 = os.path.join(__proj_dir, 'b', 'b.c')
132+
def test_gui_project_loads_absolute_vs_solution(tmp_path):
133+
proj_dir = tmp_path / 'proj2'
134+
shutil.copytree(__proj_dir, proj_dir)
135+
create_gui_project_file(os.path.join(tmp_path, 'test.cppcheck'), import_project=os.path.join(proj_dir, 'proj2.sln'))
136+
ret, stdout, _ = cppcheck(['--project=test.cppcheck'], cwd=tmp_path)
137+
file1 = os.path.join(proj_dir, 'a', 'a.c')
138+
file2 = os.path.join(proj_dir, 'b', 'b.c')
123139
assert ret == 0, stdout
124140
assert stdout.find('Checking %s Debug|Win32...' % file1) >= 0
125141
assert stdout.find('Checking %s Debug|x64...' % file1) >= 0
@@ -130,26 +146,28 @@ def test_gui_project_loads_absolute_vs_solution():
130146
assert stdout.find('Checking %s Release|Win32...' % file2) >= 0
131147
assert stdout.find('Checking %s Release|x64...' % file2) >= 0
132148

133-
def test_gui_project_loads_relative_vs_solution_2():
134-
create_gui_project_file(os.path.join(__script_dir, 'test.cppcheck'), root_path='proj2', import_project='proj2/proj2.sln') # TODO: generate in temporary folder
135-
ret, stdout, stderr = cppcheck(['--project=test.cppcheck'], cwd=__script_dir)
136-
os.remove(os.path.join(__script_dir, 'test.cppcheck')) # TODO: do not remove explicitly
149+
def test_gui_project_loads_relative_vs_solution_2(tmp_path):
150+
proj_dir = tmp_path / 'proj2'
151+
shutil.copytree(__proj_dir, proj_dir)
152+
create_gui_project_file(os.path.join(tmp_path, 'test.cppcheck'), root_path='proj2', import_project='proj2/proj2.sln')
153+
ret, stdout, stderr = cppcheck(['--project=test.cppcheck'], cwd=tmp_path)
137154
assert ret == 0, stdout
138155
assert stderr == __ERR_A + __ERR_B
139156

140-
def test_gui_project_loads_relative_vs_solution_with_exclude():
141-
create_gui_project_file(os.path.join(__script_dir, 'test.cppcheck'), root_path='proj2', import_project='proj2/proj2.sln', exclude_paths=['b']) # TODO: generate in temporary folder
142-
ret, stdout, stderr = cppcheck(['--project=test.cppcheck'], cwd=__script_dir)
143-
os.remove(os.path.join(__script_dir, 'test.cppcheck')) # TODO: do not remove explicitly
157+
def test_gui_project_loads_relative_vs_solution_with_exclude(tmp_path):
158+
proj_dir = tmp_path / 'proj2'
159+
shutil.copytree(__proj_dir, proj_dir)
160+
create_gui_project_file(os.path.join(tmp_path, 'test.cppcheck'), root_path='proj2', import_project='proj2/proj2.sln', exclude_paths=['b'])
161+
ret, stdout, stderr = cppcheck(['--project=test.cppcheck'], cwd=tmp_path)
144162
assert ret == 0, stdout
145163
assert stderr == __ERR_A
146164

147-
def test_gui_project_loads_absolute_vs_solution_2():
148-
# TODO: generate in temporary folder
149-
create_gui_project_file(os.path.join(__script_dir, 'test.cppcheck'),
150-
root_path=__proj_dir,
151-
import_project=os.path.join(__proj_dir, 'proj2.sln'))
152-
ret, stdout, stderr = cppcheck(['--project=test.cppcheck'], cwd=__script_dir)
153-
os.remove(os.path.join(__script_dir, 'test.cppcheck')) # TODO: do not remove explicitly
165+
def test_gui_project_loads_absolute_vs_solution_2(tmp_path):
166+
proj_dir = tmp_path / 'proj2'
167+
shutil.copytree(__proj_dir, proj_dir)
168+
create_gui_project_file(os.path.join(tmp_path, 'test.cppcheck'),
169+
root_path=str(proj_dir),
170+
import_project=os.path.join(proj_dir, 'proj2.sln'))
171+
ret, stdout, stderr = cppcheck(['--project=test.cppcheck'], cwd=tmp_path)
154172
assert ret == 0, stdout
155173
assert stderr == __ERR_A + __ERR_B

0 commit comments

Comments
 (0)