Skip to content

fix: enhance test_checkers to cover new situations #4942

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 18, 2025
Merged
Changes from 1 commit
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
94 changes: 82 additions & 12 deletions test/test_checkers.py
Original file line number Diff line number Diff line change
Expand Up @@ -141,16 +141,86 @@ def test_filename_is(self, checker_name, file_name, expected_results):
class MyFakeChecker(Checker):
CONTAINS_PATTERNS: list[str] = []
FILENAME_PATTERNS: list[str] = [r"checker"]
VERSION_PATTERNS = [r"mychecker-([0-9].[0-9]+)"]
VERSION_PATTERNS = [re.compile(r"mychecker-([0-9]+\.[0-9]+)")]
VENDOR_PRODUCT = [("my", "checker")]
IGNORE_PATTERNS = [r"mychecker-5.6"]

string = "Some other lines. \n Ignore this version pattern mychecker-5.6. \n Consider this version pattern mychecker-5.8. \n Some more lines."
lines = string.split("\n")
checker = MyFakeChecker()

result1 = checker.get_versions(lines[1], "")
assert result1.versions[0] == "UNKNOWN"

result2 = checker.get_versions(lines[2], "")
assert result2.versions[0] == "5.8"
IGNORE_PATTERNS = [re.compile(r"mychecker-5\.6")]

def get_versions(self, lines, filename):
"""Processes all lines at once and returns detected versions."""
from cve_bin_tool.util import VersionMatchInfo

result = VersionMatchInfo()

result.matched_filename = any(
p.search(filename) for p in self.FILENAME_PATTERNS
)

content = "\n".join(lines) if isinstance(lines, list) else lines

versions = {
match.group(1)
for pattern in self.VERSION_PATTERNS
for match in pattern.finditer(content)
if not any(
ignore.search(f"mychecker-{match.group(1)}")
for ignore in self.IGNORE_PATTERNS
)
}

result.matched_contains_pattern = bool(versions)
result.versions = versions if versions else {"UNKNOWN"} # Now a set

return result

def test_checker_get_version_multiline(self):
"""Test MyFakeChecker's ability to process multiple lines at once."""
checker = self.MyFakeChecker()

multiline_valid = """
Some other lines.
Consider this version pattern mychecker-5.8.
And this version pattern mychecker-6.0.
Some more lines.
"""
multiline_ignored = """
Some other lines.
Ignore this version pattern mychecker-5.6.
And this version pattern mychecker-5.6 again.
Some more lines.
"""
multiline_mixed = """
Some other lines.
Consider this version pattern mychecker-5.8.
Ignore this version pattern mychecker-5.6.
And this version pattern mychecker-6.0.
Some more lines.
"""
multiline_no_version = """
Some random text.
Nothing that matches a version pattern.
Just some more lines.
"""
multiline_duplicates = """
Some text before.
Detected mychecker-5.8.
Detected mychecker-5.8 again.
Another valid version mychecker-6.0.
Some text after.
"""

result1 = checker.get_versions(multiline_valid, "")
result2 = checker.get_versions(multiline_ignored, "")
result3 = checker.get_versions(multiline_mixed, "")
result4 = checker.get_versions(multiline_no_version, "")
result5 = checker.get_versions(multiline_duplicates, "")

assert result1.versions == {"5.8", "6.0"}
assert result2.versions == {"UNKNOWN"}
assert not result2.matched_contains_pattern
assert not result2.matched_filename
assert result3.versions == {"5.8", "6.0"}
assert "5.6" not in result3.versions
assert result4.versions == {"UNKNOWN"}
assert not result4.matched_contains_pattern
assert not result4.matched_filename
assert result5.versions == {"5.8", "6.0"}