# POSIX Soft Conformance Suite

This directory contains integration tests that exercise mergerfs FUSE operations
and compare behavior against equivalent native syscalls on a local filesystem.

The suite is "soft POSIX": it focuses on practical parity for return values,
`errno`, and key side effects, including common error paths.

Run with:

```bash
python3 tests/run-tests /mnt/mergerfs/
```

## Coverage Matrix

- `access` -> `TEST_posix_access`
- `chmod` / `fchmod` -> `TEST_posix_chmod`, `TEST_use_fchmod_after_unlink`
- `chown` / `fchown` -> `TEST_posix_chown`, `TEST_use_fchown_after_unlink`
- `create` / `mknod` -> `TEST_posix_create_mknod`
- `getattr` / `fgetattr` -> `TEST_posix_getattr_fgetattr`, `TEST_use_fstat_after_unlink`
- `open` / `read` / `write` -> `TEST_posix_open_read_write`, `TEST_o_direct`
- `flush` / `release` / `fsync` / `fsyncdir` -> `TEST_posix_fsync_flush`
- `release` close semantics -> `TEST_posix_release`
- `releasedir` close semantics -> `TEST_posix_releasedir`
- `truncate` / `ftruncate` -> `TEST_posix_truncate_ftruncate`, `TEST_use_ftruncate_after_unlink`
- `utimens` / `futimens` -> `TEST_posix_utimens`, `TEST_use_futimens_after_unlink`
- `fallocate` -> `TEST_use_fallocate_after_unlink`
- `copy_file_range` -> `TEST_posix_copy_file_range`
- `ioctl` -> `TEST_posix_ioctl`
- `poll` -> `TEST_posix_poll`
- `tmpfile` (`O_TMPFILE`) -> `TEST_posix_tmpfile`
- `bmap` (via `FIBMAP` ioctl parity) -> `TEST_posix_bmap`
- `readlink` -> `TEST_readlink_semantics`
- `link` / `symlink` -> `TEST_posix_link_symlink`
- `mkdir` / `rmdir` -> `TEST_posix_mkdir_rmdir`
- `unlink` / `rename` -> `TEST_posix_unlink_rename`, `TEST_unlink_rename`
- `statfs` -> `TEST_posix_statfs`
- `statx` -> `TEST_posix_statx`
- `syncfs` -> `TEST_posix_syncfs`
- `flock` / `lock` -> `TEST_posix_locking`
- `setxattr` / `getxattr` / `listxattr` / `removexattr` -> `TEST_posix_xattr`
- xattr object/flag matrix (`file`, `dir`, symlink `l*`, create/replace) -> `TEST_posix_xattr_matrix`
- xattr mode runtime toggles (`passthrough`/`noattr`/`nosys`) -> `TEST_cfg_xattr_modes`
- statfs mode and statfs-ignore runtime toggles -> `TEST_cfg_statfs_ignore`
- EXDEV fallback runtime toggles for link/rename -> `TEST_cfg_link_rename_exdev`
- `readdir` (+ seek/tell behavior) -> `TEST_posix_readdir`
- `readdir_plus` semantic parity (list+stat and readdir policy toggles) -> `TEST_posix_readdir_plus`
- lifecycle (`init`/`destroy`) harness check -> `TEST_mount_lifecycle`
- hidden temp exposure checks -> `TEST_no_fuse_hidden`

## Error Conditions Emphasized

Across tests, parity checks include combinations of:

- `ENOENT`
- `ENOTDIR`
- `EEXIST`
- `ENOTEMPTY`
- `EISDIR`
- `EBADF`
- privilege-sensitive outcomes (for example `EPERM`) where applicable

## Notes

- Some behavior is runtime/environment dependent (kernel, mount options,
  uid/gid, capabilities). Tests compare mergerfs to native behavior in the same
  runtime to keep assertions robust.
- The xattr test uses a `user.*` key and assumes user xattrs are enabled.
