Files
trailofbits-buttercup/common/tests/test_stack_parser.py
T
2over12 85e9f4818d Sliced Parser (#265)
* sliced parser

* add local target search

* update orchestrator

* more fixes

* test more

* remove ext refs

* lints

* fix list

* docs

* update
2025-03-27 08:49:20 -04:00

84 lines
2.4 KiB
Python

import pytest
from buttercup.common.stack_parsing import get_crash_data
from pathlib import Path
def get_tc_file(name: str) -> Path:
"""Get testcase file"""
crash_file = Path(__file__).parent / "data" / "stacktrace_corpus" / f"{name}_stacktrace.txt"
if not crash_file.exists():
raise FileNotFoundError(f"Crash file not found at {crash_file}")
return crash_file
@pytest.fixture
def java_crash_testcase() -> Path:
"""Get java crash_test_case"""
return get_tc_file("java")
@pytest.fixture
def c_crash_testcase() -> Path:
"""Get c crash_test_case"""
return get_tc_file("c")
def test_get_crash_data_basic():
# Simple stacktrace example
stacktrace = """
#0 0x7f339b644844 in foo::bar::crash() /src/foo/bar.cc:123:4
#1 0x7f339b644900 in main /src/main.cc:45:2
"""
crash_state = get_crash_data(stacktrace)
assert crash_state is not None
assert isinstance(crash_state, str)
def test_get_crash_data_symbolized():
# Test with symbolized stacktrace
stacktrace = """
#0 foo::bar::crash() /src/foo/bar.cc:123:4
#1 main /src/main.cc:45:2
"""
crash_state = get_crash_data(stacktrace, symbolized=True)
assert crash_state is not None
assert isinstance(crash_state, str)
def test_get_crash_data_empty():
# Test with empty stacktrace
stacktrace = ""
crash_state = get_crash_data(stacktrace)
assert crash_state is not None
assert isinstance(crash_state, str)
def test_get_crash_data_invalid():
# Test with invalid stacktrace format
stacktrace = "This is not a valid stacktrace"
crash_state = get_crash_data(stacktrace)
assert crash_state is not None
assert isinstance(crash_state, str)
def test_java_stacktrace(java_crash_testcase: Path):
with open(java_crash_testcase, "r") as f:
trace = f.read()
crash_state = get_crash_data(trace)
expected = "org.apache.commons.jxpath.ri.compiler.CoreOperation.parenthesize\norg.apache.commons.jxpath.ri.compiler.CoreOperation.toString\norg.apache.commons.jxpath.ri.compiler.CoreOperation.parenthesize\n"
assert crash_state == expected
def test_c_stacktrace(c_crash_testcase: Path):
with open(c_crash_testcase, "r") as f:
trace = f.read()
crash_state = get_crash_data(trace)
print(crash_state)
assert crash_state is not None
assert isinstance(crash_state, str)
expected = "cil_destroy_block\ncil_destroy_data\ncil_tree_node_destroy\n"
assert crash_state == expected