Загрузка данных


#!/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)