diff --git a/cli/executor.cpp b/cli/executor.cpp index 31578399e35..8ef1de84a90 100644 --- a/cli/executor.cpp +++ b/cli/executor.cpp @@ -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"; diff --git a/test/cli/more-projects_test.py b/test/cli/more-projects_test.py index f3ed273c4b9..03dc00ed0f3 100644 --- a/test/cli/more-projects_test.py +++ b/test/cli/more-projects_test.py @@ -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 == '' @@ -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 == '' @@ -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 == '' @@ -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 == '' @@ -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 diff --git a/test/cli/other_test.py b/test/cli/other_test.py index 38391ad0720..0031affe3ce 100644 --- a/test/cli/other_test.py +++ b/test/cli/other_test.py @@ -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 == '' @@ -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) @@ -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 == '' @@ -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 == '' @@ -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 == '' @@ -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 == '' @@ -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