import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '..', '..', 'tests'))
from security_framework import SecurityTestFramework
def tool_specific_tests(fw):
fw.log("\n=== 13. Tool-Specific: rev ===")
rc_a, out_a, _ = fw.run_asm([], stdin_data=b"hello\n")
rc_g, out_g, _ = fw.run_gnu([], stdin_data=b"hello\n")
fw.report_result(out_a == out_g, "rev: basic reverse matches GNU")
fw.report_result(out_a == b"olleh\n", "rev: 'hello' -> 'olleh'")
data = b"abc\ndef\nghi\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: multiple lines matches GNU")
rc_a, out_a, _ = fw.run_asm([], stdin_data=b"")
rc_g, out_g, _ = fw.run_gnu([], stdin_data=b"")
fw.report_result(out_a == out_g, "rev: empty input matches GNU")
data = b"\n\nhello\n\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: empty lines preserved matches GNU")
data = b"a\nb\nc\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: single char lines matches GNU")
data = b"racecar\nmadam\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
fw.report_result(out_a == b"racecar\nmadam\n", "rev: palindromes unchanged")
data = b" hello \n\tworld\t\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: spaces and tabs matches GNU")
long_line = b"A" * 10000 + b"\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=long_line)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=long_line)
fw.report_result(out_a == out_g, "rev: very long line (10KB) matches GNU")
original = b"hello world\nfoo bar baz\n12345\n"
rc1, mid, _ = fw.run_asm([], stdin_data=original)
rc2, final, _ = fw.run_asm([], stdin_data=mid)
fw.report_result(final == original, "rev: roundtrip rev|rev == original")
rc_a, out_a, _ = fw.run_asm([], stdin_data=b"hello")
rc_g, out_g, _ = fw.run_gnu([], stdin_data=b"hello")
fw.report_result(out_a == out_g, "rev: no trailing newline matches GNU")
data = b"!@#$%^&*()\n[]{}<>|\\~`\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: special characters matches GNU")
data = b"1234567890\n0987654321\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
fw.report_result(out_a == b"0987654321\n1234567890\n", "rev: numbers reversed correctly")
data = "caf\u00e9\n".encode('utf-8')
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: multibyte chars matches GNU")
data = b"".join(f"{c}\n".encode() for c in "abcdefghijklmnopqrstuvwxyz")
rc_a, out_a, _ = fw.run_asm([], stdin_data=data)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=data)
fw.report_result(out_a == out_g, "rev: 26 single-char lines matches GNU")
crlf = b"hello\r\nworld\r\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=crlf)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=crlf)
fw.report_result(out_a == out_g, "rev: CRLF input matches GNU")
large = b"".join(f"line{i:06d}\n".encode() for i in range(10000))
rc_a, out_a, _ = fw.run_asm([], stdin_data=large, timeout=10)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=large, timeout=10)
fw.report_result(out_a == out_g, "rev: large input (10K lines) matches GNU")
binary_line = bytes(range(1, 128)) + b"\n"
rc_a, out_a, _ = fw.run_asm([], stdin_data=binary_line)
rc_g, out_g, _ = fw.run_gnu([], stdin_data=binary_line)
fw.report_result(out_a == out_g, "rev: binary data line matches GNU")
config = {
'tool_name': 'rev',
'bin_name': 'frev',
'gnu_path': '/usr/bin/rev',
'bss_size': 65536,
'max_binary_size': 30000,
'test_args': [],
'test_stdin': b"hello\nworld\n",
'timeout': 5,
}
if __name__ == '__main__':
fw = SecurityTestFramework(config)
fw.run_all(tool_specific_fn=tool_specific_tests)