import pytest from tools.havoc_debug_protocol import evaluate_condition def test_register_condition_true(): registers = {"eax": 0x50} condition = {"register": "eax", "op": "!=", "value": "0x47"} assert evaluate_condition(condition, registers, read_memory=None) is True def test_register_condition_false(): registers = {"eax": 0x47} condition = {"register": "eax", "op": "!=", "value": "0x47"} assert evaluate_condition(condition, registers, read_memory=None) is False def test_register_condition_equals(): registers = {"eip": 0x436070} condition = {"register": "eip", "op": "==", "value": "0x436070"} assert evaluate_condition(condition, registers, read_memory=None) is True def test_memory_condition_with_offset(): def fake_read_memory(addr, size): assert addr == 0x47eb48 + 0x18 assert size == 4 return (0x47).to_bytes(4, "little") condition = {"memory": "0x47eb48+0x18", "size": 4, "op": "==", "value": "0x47"} assert evaluate_condition(condition, {}, fake_read_memory) is True def test_memory_condition_no_offset(): def fake_read_memory(addr, size): assert addr == 0x47da88 return (0).to_bytes(size, "little") condition = {"memory": "0x47da88", "size": 4, "op": "==", "value": "0x0"} assert evaluate_condition(condition, {}, fake_read_memory) is True def test_comparison_operators(): registers = {"ecx": 10} assert evaluate_condition({"register": "ecx", "op": "<", "value": "0xb"}, registers, None) assert evaluate_condition({"register": "ecx", "op": ">", "value": "0x9"}, registers, None) assert evaluate_condition({"register": "ecx", "op": "<=", "value": "0xa"}, registers, None) assert evaluate_condition({"register": "ecx", "op": ">=", "value": "0xa"}, registers, None) def test_unknown_register_raises(): with pytest.raises(KeyError): evaluate_condition({"register": "bogus", "op": "==", "value": "0x0"}, {}, None)