#!/usr/bin/env python3

import os
import sys
import tempfile

from posix_parity import cleanup_paths
from posix_parity import compare_calls
from posix_parity import fail
from posix_parity import join
from posix_parity import touch


def main():
    if len(sys.argv) != 2:
        print("usage: TEST_posix_mkdir_rmdir <mountpoint>", file=sys.stderr)
        return 1

    mount = sys.argv[1]

    with tempfile.TemporaryDirectory() as native:
        merge_dir = join(mount, "posix-mkdir/dir")
        native_dir = join(native, "posix-mkdir/dir")
        merge_notdir = join(mount, "posix-mkdir/notdir")
        native_notdir = join(native, "posix-mkdir/notdir")

        cleanup_paths([merge_dir, merge_notdir])
        os.makedirs(join(mount, "posix-mkdir"), exist_ok=True)
        os.makedirs(join(native, "posix-mkdir"), exist_ok=True)

        err = compare_calls("mkdir success", lambda: os.mkdir(merge_dir, 0o755), lambda: os.mkdir(native_dir, 0o755))
        if err:
            return fail(err)

        err = compare_calls("mkdir EEXIST", lambda: os.mkdir(merge_dir, 0o755), lambda: os.mkdir(native_dir, 0o755))
        if err:
            return fail(err)

        touch(merge_notdir, b"x")
        touch(native_notdir, b"x")
        err = compare_calls(
            "mkdir ENOTDIR",
            lambda: os.mkdir(join(merge_notdir, "child"), 0o755),
            lambda: os.mkdir(join(native_notdir, "child"), 0o755),
        )
        if err:
            return fail(err)

        err = compare_calls("rmdir success", lambda: os.rmdir(merge_dir), lambda: os.rmdir(native_dir))
        if err:
            return fail(err)

        err = compare_calls("rmdir ENOENT", lambda: os.rmdir(merge_dir), lambda: os.rmdir(native_dir))
        if err:
            return fail(err)

        touch(join(mount, "posix-mkdir/nonempty/file"), b"x")
        touch(join(native, "posix-mkdir/nonempty/file"), b"x")
        err = compare_calls(
            "rmdir ENOTEMPTY",
            lambda: os.rmdir(join(mount, "posix-mkdir/nonempty")),
            lambda: os.rmdir(join(native, "posix-mkdir/nonempty")),
        )
        if err:
            return fail(err)

        return 0


if __name__ == "__main__":
    raise SystemExit(main())
