#!/usr/bin/env python3
import subprocess
import sys
import os
TEST_SUITE = [
# Категория 1: Позитивные тесты
("chown root file.txt", "True"),
("chown root:users /var/log", "True"),
("chown :group file.txt", "True"),
("chown 1000:1000 file.txt", "True"),
("chown root: file.txt", "True"),
("chown -R user:group /dir", "True"),
("chown -c root file.txt", "True"),
("chown -v --dereference root file.txt", "True"),
("chown -h --no-dereference symlink", "True"),
("chown --from=admin:staff root file.txt", "True"),
("chown --reference=ref.txt file.txt", "True"),
("chown -R --preserve-root root /", "True"),
("chown -R -L -H root /dir", "True"),
("chown --help", "True"),
# Категория 2: Ошибки имени и ключей
("chovn root file.txt", "False"),
("Chown root file.txt", "False"),
("chown -z file.txt", "False"),
("chown -R -X root /dir", "False"),
("chown --unsupported root file", "False"),
("chown -Rvf root file.txt", "True"),
("chown -Rzv file.txt", "False"),
# Категория 3: Ошибки синтаксиса OWNER/GROUP
("chown 123user file.txt", "False"),
("chown user! file.txt", "False"),
("chown user@group file.txt", "False"),
("chown user:group:extra file.txt", "False"),
("chown :", "False"),
# Категория 4: Ошибки файловых аргументов
("chown root", "False"),
("chown -R user:group", "False"),
("chown --from=admin:staff root", "False")
]
def run_engine_test(target_command, name):
print(f"--- Running Blackbox Tests on Target: {name} ---")
if os.path.exists("chown_stats.txt"):
os.remove("chown_stats.txt")
try:
proc = subprocess.Popen(
target_command,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
)
except Exception as e:
print(f"Critical Error launching {name}: {e}")
return False
success_internal = 0
failed_internal = 0
for cmd, expected in TEST_SUITE:
proc.stdin.write(cmd + "\n")
proc.stdin.flush()
output = proc.stdout.readline().strip()
if output == expected:
success_internal += 1
else:
print(f"FAIL: '{cmd}' -> Expected '{expected}', Got '{output}'")
failed_internal += 1
stats_checks = [
("getstats", "15 15 30"),
("getsuccess", "15"),
("getfailed", "15"),
("resetstats", ""),
("getstats", "0 0 0")
]
for cmd, expected in stats_checks:
proc.stdin.write(cmd + "\n")
proc.stdin.flush()
output = proc.stdout.readline().strip()
if output == expected:
success_internal += 1
else:
print(f"FAIL Stats Control: '{cmd}' -> Expected '{expected}', Got '{output}'")
failed_internal += 1
proc.terminate()
print(f"Result for {name}: Passed {success_internal}/{success_internal + failed_internal} points.")
return failed_internal == 0
if __name__ == '__main__':
c_ok = run_engine_test("./chown_check", "C Binary")
py_ok = run_engine_test("python3 chown_check.py", "Python Script")
if c_ok and py_ok:
print("\nALL BLACKBOX TESTS PASSED SUCCESSFULLY.")
sys.exit(0)
else:
print("\nSOME BLACKBOX TESTS FAILED.")
sys.exit(1)