Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cli/executor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ void Executor::reportStatus(std::size_t fileindex, std::size_t filecount, std::s
{
if (filecount > 1) {
std::ostringstream oss;
const unsigned long percentDone = (sizetotal > 0) ? (100 * sizedone) / sizetotal : 0;
const unsigned long percentDone = (sizetotal > 0) ? (100 * sizedone) / sizetotal : (100 * fileindex / filecount);
oss << fileindex << '/' << filecount
<< " files checked " << percentDone
<< "% done";
Expand Down
66 changes: 51 additions & 15 deletions test/cli/more-projects_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -574,13 +574,13 @@ def test_project_file_order(tmpdir):
lines = stdout.splitlines()
assert lines == [
'Checking {} ...'.format(test_file_c),
'1/4 files checked 0% done',
'1/4 files checked 25% done',
'Checking {} ...'.format(test_file_d),
'2/4 files checked 0% done',
'2/4 files checked 50% done',
'Checking {} ...'.format(test_file_b),
'3/4 files checked 0% done',
'3/4 files checked 75% done',
'Checking {} ...'.format(test_file_a),
'4/4 files checked 0% done'
'4/4 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -648,11 +648,11 @@ def test_project_file_duplicate_2(tmpdir):
lines = stdout.splitlines()
assert lines == [
'Checking {} ...'.format(test_file_c),
'1/3 files checked 0% done',
'1/3 files checked 33% done',
'Checking {} ...'.format(test_file_a),
'2/3 files checked 0% done',
'2/3 files checked 66% done',
'Checking {} ...'.format(test_file_b),
'3/3 files checked 0% done'
'3/3 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -696,18 +696,18 @@ def test_project_file_duplicate_3(tmpdir):
if sys.platform == 'win32':
assert lines == [
'Checking {} ...'.format(test_file_a),
'1/3 files checked 0% done',
'1/3 files checked 33% done',
'Checking {} ...'.format(test_file_a),
'2/3 files checked 0% done',
'2/3 files checked 66% done',
'Checking {} ...'.format(test_file_a),
'3/3 files checked 0% done'
'3/3 files checked 100% done'
]
else:
assert lines == [
'Checking {} ...'.format(test_file_a),
'1/2 files checked 0% done',
'1/2 files checked 50% done',
'Checking {} ...'.format(test_file_a),
'2/2 files checked 0% done'
'2/2 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -764,11 +764,11 @@ def test_project_file_duplicate_4(tmpdir):
# TODO: only a single file should be checked
assert lines == [
'Checking {} ...'.format(test_file_a),
'1/3 files checked 0% done',
'1/3 files checked 33% done',
'Checking {} ...'.format(test_file_a),
'2/3 files checked 0% done',
'2/3 files checked 66% done',
'Checking {} ...'.format(test_file_a),
'3/3 files checked 0% done'
'3/3 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -1061,3 +1061,39 @@ def test_project_file_no_analyze_all_vs_configs(tmp_path):
ret, stdout, stderr = cppcheck(['--project=' + str(project_path)])
assert ret == 0, stdout
assert stderr == ''


@pytest.mark.parametrize("j,executor", [
(1, "thread"),
(2, "thread"),
(2, "process"),
])
def test_project_progress(tmp_path, j, executor):
if sys.platform == 'win32' and executor == "process":
pytest.skip("process executor not supported on Windows")

code = 'x = 1;'
with open(tmp_path / 'test1.c', 'wt') as f:
f.write(code)
with open(tmp_path / 'test2.c', 'wt') as f:
f.write(code)

compilation_db = [
{"directory": str(tmp_path),
"command": "gcc -c test1.c",
"file": "test1.c",
"output": "test1.o"},
{"directory": str(tmp_path),
"command": "gcc -c test2.c",
"file": "test2.c",
"output": "test2.o"},
]

project_file = tmp_path / 'compile_commands.json'

with open(project_file, 'wt') as f:
f.write(json.dumps(compilation_db))

_, stdout, _ = cppcheck([f'--project={project_file}', f'-j{j}', f'--executor={executor}'])
assert '1/2 files checked 50% done' in stdout
assert '2/2 files checked 100% done' in stdout
84 changes: 39 additions & 45 deletions test/cli/other_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1016,13 +1016,13 @@ def test_file_order(tmpdir):
lines = stdout.splitlines()
assert lines == [
'Checking {} ...'.format(test_file_c),
'1/4 files checked 0% done',
'1/4 files checked 25% done',
'Checking {} ...'.format(test_file_d),
'2/4 files checked 0% done',
'2/4 files checked 50% done',
'Checking {} ...'.format(test_file_b),
'3/4 files checked 0% done',
'3/4 files checked 75% done',
'Checking {} ...'.format(test_file_a),
'4/4 files checked 0% done'
'4/4 files checked 100% done'
]
assert stderr == ''

Expand All @@ -1044,13 +1044,13 @@ def test_markup(tmpdir):
args = ['--library=qt', test_file_1, test_file_2, test_file_3, test_file_4, '-j1']
out_lines = [
'Checking {} ...'.format(test_file_2),
'1/4 files checked 0% done',
'1/4 files checked 25% done',
'Checking {} ...'.format(test_file_4),
'2/4 files checked 0% done',
'2/4 files checked 50% done',
'Checking {} ...'.format(test_file_1),
'3/4 files checked 0% done',
'3/4 files checked 75% done',
'Checking {} ...'.format(test_file_3),
'4/4 files checked 0% done'
'4/4 files checked 100% done'
]

assert_cppcheck(args, ec_exp=0, err_exp=[], out_exp=out_lines)
Expand All @@ -1075,23 +1075,17 @@ def test_markup_j(tmpdir):
exitcode, stdout, stderr = cppcheck(args)
assert exitcode == 0, stdout if stdout else stderr
lines = stdout.splitlines()
for i in range(1, 5):
lines.remove('{}/4 files checked 0% done'.format(i))

# this test started to fail in the -j2 injection run when using ThreadExecutor although it always specifies -j2.
# the order of the files in the output changed so just check for the file extentions
assert len(lines) == 4
assert lines[0].endswith('.cpp ...')
assert lines[1].endswith('.cpp ...')
assert lines[2].endswith('.qml ...')
assert lines[3].endswith('.qml ...')

#assert lines == [
# 'Checking {} ...'.format(test_file_2),
# 'Checking {} ...'.format(test_file_4),
# 'Checking {} ...'.format(test_file_1),
# 'Checking {} ...'.format(test_file_3)
#]

assert sorted(lines) == [
'1/4 files checked 25% done',
'2/4 files checked 50% done',
'3/4 files checked 75% done',
'4/4 files checked 100% done',
'Checking {} ...'.format(test_file_1),
'Checking {} ...'.format(test_file_2),
'Checking {} ...'.format(test_file_3),
'Checking {} ...'.format(test_file_4)
]
assert stderr == ''


Expand Down Expand Up @@ -1213,11 +1207,11 @@ def test_file_duplicate_2(tmpdir):
lines = stdout.splitlines()
assert lines == [
'Checking {} ...'.format(test_file_c),
'1/3 files checked 0% done',
'1/3 files checked 33% done',
'Checking {} ...'.format(test_file_a),
'2/3 files checked 0% done',
'2/3 files checked 66% done',
'Checking {} ...'.format(test_file_b),
'3/3 files checked 0% done'
'3/3 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -1245,28 +1239,28 @@ def test_file_duplicate_3(tmpdir):
if sys.platform == 'win32':
assert lines == [
'Checking {} ...'.format('a.c'),
'1/6 files checked 0% done',
'1/6 files checked 16% done',
'Checking {} ...'.format('a.c'),
'2/6 files checked 0% done',
'2/6 files checked 33% done',
'Checking {} ...'.format('a.c'),
'3/6 files checked 0% done',
'3/6 files checked 50% done',
'Checking {} ...'.format(test_file_a),
'4/6 files checked 0% done',
'4/6 files checked 66% done',
'Checking {} ...'.format(test_file_a),
'5/6 files checked 0% done',
'5/6 files checked 83% done',
'Checking {} ...'.format(test_file_a),
'6/6 files checked 0% done'
'6/6 files checked 100% done'
]
else:
assert lines == [
'Checking {} ...'.format('a.c'),
'1/4 files checked 0% done',
'1/4 files checked 25% done',
'Checking {} ...'.format('a.c'),
'2/4 files checked 0% done',
'2/4 files checked 50% done',
'Checking {} ...'.format(test_file_a),
'3/4 files checked 0% done',
'3/4 files checked 75% done',
'Checking {} ...'.format(test_file_a),
'4/4 files checked 0% done'
'4/4 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -1298,17 +1292,17 @@ def test_file_duplicate_4(tmpdir):
# TODO: only a single file should be checked
assert lines == [
'Checking {} ...'.format('a.c'),
'1/6 files checked 0% done',
'1/6 files checked 16% done',
'Checking {} ...'.format('a.c'),
'2/6 files checked 0% done',
'2/6 files checked 33% done',
'Checking {} ...'.format('a.c'),
'3/6 files checked 0% done',
'3/6 files checked 50% done',
'Checking {} ...'.format(test_file_a),
'4/6 files checked 0% done',
'4/6 files checked 66% done',
'Checking {} ...'.format(test_file_a),
'5/6 files checked 0% done',
'5/6 files checked 83% done',
'Checking {} ...'.format(test_file_a),
'6/6 files checked 0% done'
'6/6 files checked 100% done'
]
assert stderr == ''

Expand Down Expand Up @@ -1663,7 +1657,7 @@ def test_filelist(tmpdir):
]
assert len(expected), len(lines)
for i in range(1, len(expected)+1):
lines.remove('{}/{} files checked 0% done'.format(i, len(expected)))
lines.remove('{}/{} files checked {}% done'.format(i, len(expected), int(100 * i // len(expected))))
assert lines == expected


Expand Down
Loading