147 lines
4.9 KiB
Python
147 lines
4.9 KiB
Python
# python -m pytest test-projects.py
|
|
|
|
import pytest
|
|
import os
|
|
import json
|
|
from testutils import cppcheck
|
|
|
|
|
|
@pytest.mark.parametrize("project_ext", ["json", "sln", "vcxproj", "bpr", "cppcheck"])
|
|
def test_missing_project(project_ext):
|
|
project_file = "file.{}".format(project_ext)
|
|
|
|
ret, stdout, stderr = cppcheck(['--project=' + project_file, '--template=cppcheck1'])
|
|
assert 1 == ret
|
|
assert "cppcheck: error: failed to open project '{}'. The file does not exist.\n".format(project_file) == stdout
|
|
assert "" == stderr
|
|
|
|
|
|
def _test_project_error(tmpdir, ext, content, expected):
|
|
project_file = os.path.join(tmpdir, "file.{}".format(ext))
|
|
|
|
with open(project_file, 'w') as f:
|
|
if content is not None:
|
|
f.write(content)
|
|
|
|
ret, stdout, stderr = cppcheck(['--project=' + str(project_file)])
|
|
assert 1 == ret
|
|
assert "cppcheck: error: " + expected + "\ncppcheck: error: failed to load project '{}'. An error occurred.\n".format(project_file) == stdout
|
|
assert "" == stderr
|
|
|
|
|
|
@pytest.mark.parametrize("project_ext, expected", [
|
|
("json", "compilation database is not a JSON array"),
|
|
("sln", "Visual Studio solution file is empty"),
|
|
("vcxproj", "Visual Studio project file is not a valid XML - XML_ERROR_EMPTY_DOCUMENT"),
|
|
("bpr", "Borland project file is not a valid XML - XML_ERROR_EMPTY_DOCUMENT"),
|
|
("cppcheck", "Cppcheck GUI project file is not a valid XML - XML_ERROR_EMPTY_DOCUMENT")
|
|
])
|
|
def test_empty_project(tmpdir, project_ext, expected):
|
|
_test_project_error(tmpdir, project_ext, None, expected)
|
|
|
|
|
|
def test_json_entry_file_not_found(tmpdir):
|
|
compilation_db = [
|
|
{"directory": str(tmpdir),
|
|
"command": "c++ -o bug1.o -c bug1.cpp",
|
|
"file": "bug1.cpp",
|
|
"output": "bug1.o"}
|
|
]
|
|
|
|
expected = "'{}' from compilation database does not exist".format(os.path.join(tmpdir, "bug1.cpp"))
|
|
|
|
_test_project_error(tmpdir, "json", json.dumps(compilation_db), expected)
|
|
|
|
|
|
def test_json_no_arguments(tmpdir):
|
|
compilation_db = [
|
|
{"directory": str(tmpdir),
|
|
"file": "bug1.cpp",
|
|
"output": "bug1.o"}
|
|
]
|
|
|
|
expected = "no 'arguments' or 'command' field found in compilation database entry"
|
|
|
|
_test_project_error(tmpdir, "json", json.dumps(compilation_db), expected)
|
|
|
|
|
|
def test_json_invalid_arguments(tmpdir):
|
|
compilation_db = [
|
|
{"directory": str(tmpdir),
|
|
"arguments": "",
|
|
"file": "bug1.cpp",
|
|
"output": "bug1.o"}
|
|
]
|
|
|
|
expected = "'arguments' field in compilation database entry is not a JSON array"
|
|
|
|
_test_project_error(tmpdir, "json", json.dumps(compilation_db), expected)
|
|
|
|
|
|
def test_sln_invalid_file(tmpdir):
|
|
content = "some file"
|
|
|
|
expected = "Visual Studio solution file header not found"
|
|
|
|
_test_project_error(tmpdir, "sln", content, expected)
|
|
|
|
|
|
def test_sln_no_header(tmpdir):
|
|
content = "\xEF\xBB\xBF\r\n" \
|
|
"some header"
|
|
|
|
expected = "Visual Studio solution file header not found"
|
|
|
|
_test_project_error(tmpdir, "sln", content, expected)
|
|
|
|
|
|
def test_sln_no_projects(tmpdir):
|
|
content = "\xEF\xBB\xBF\r\n" \
|
|
"Microsoft Visual Studio Solution File, Format Version 12.00\r\n"
|
|
|
|
expected = "no projects found in Visual Studio solution file"
|
|
|
|
_test_project_error(tmpdir, "sln", content, expected)
|
|
|
|
|
|
def test_sln_project_file_not_found(tmpdir):
|
|
content = "\xEF\xBB\xBF\r\n" \
|
|
"Microsoft Visual Studio Solution File, Format Version 12.00\r\n" \
|
|
"# Visual Studio Version 16\r\n" \
|
|
"VisualStudioVersion = 16.0.29020.237\r\n" \
|
|
"MinimumVisualStudioVersion = 10.0.40219.1\r\n" \
|
|
'Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "cli", "cli\\cli.vcxproj", "{35CBDF51-2456-3EC3-99ED-113C30858883}"\r\n' \
|
|
"ProjectSection(ProjectDependencies) = postProject\r\n" \
|
|
"{C183DB5B-AD6C-423D-80CA-1F9549555A1A} = {C183DB5B-AD6C-423D-80CA-1F9549555A1A}\r\n" \
|
|
"EndProjectSection\r\n" \
|
|
"EndProject\r\n"
|
|
|
|
expected = "Visual Studio project file is not a valid XML - XML_ERROR_FILE_NOT_FOUND\n" \
|
|
"cppcheck: error: failed to load '{}' from Visual Studio solution".format(os.path.join(tmpdir, "cli\\cli.vcxproj"))
|
|
|
|
_test_project_error(tmpdir, "sln", content, expected)
|
|
|
|
|
|
def test_vcxproj_no_xml_root(tmpdir):
|
|
content = '<?xml version="1.0" encoding="utf-8"?>'
|
|
|
|
expected = "Visual Studio project file has no XML root node"
|
|
|
|
_test_project_error(tmpdir, "vcxproj", content, expected)
|
|
|
|
|
|
def test_bpr_no_xml_root(tmpdir):
|
|
content = '<?xml version="1.0" encoding="utf-8"?>'
|
|
|
|
expected = "Borland project file has no XML root node"
|
|
|
|
_test_project_error(tmpdir, "bpr", content, expected)
|
|
|
|
|
|
def test_cppcheck_no_xml_root(tmpdir):
|
|
content = '<?xml version="1.0" encoding="utf-8"?>'
|
|
|
|
expected = "Cppcheck GUI project file has no XML root node"
|
|
|
|
_test_project_error(tmpdir, "cppcheck", content, expected)
|