Skip to content

Add end-to-end file-sharing acceptance driver - #43

Merged
zackees merged 2 commits into
mainfrom
feat/issue-34-acceptance-driver
Oct 18, 2026
Merged

zackees merged 2 commits into
mainfrom
feat/issue-34-acceptance-driver

Conversation

@zackees

@zackees zackees commented Oct 18, 2026

Copy link
Copy Markdown
Owner

Closes #34. Completes the final sub-issue of #35.

Changes

  • Add a Python/dataclass Xvfb driver that launches the real viewer with isolated settings and checks all File menu + file-sharing tiers: live mount of host folders/zips into the running desktop (Off / Encrypted / Read-only / Read & write), plus Quit #26 live acceptance paths: GPU and CPU hot mounts, encrypted ZIPs and password retry, busy unmount, Quit and SIGTERM cleanup, isolation, no propagation, all tiers and transitions, overrides, and saved shares.
  • Keep the drop-zone parent bind read-only even in the Read & write tier. An explicitly writable FUSE child still accepts writes; the parent now rejects .. writes and chmod from the container. Update the relevant Rust assertion and docs.
  • Document the File menu, ~/mnt, saved shares, and tier behavior.

The driver captures the private Xvfb viewer directly with ImageMagick import, including its native video overlay and GTK dialogs. This provides the screenshot evidence without swapping the desktop image for a temporary grim layer.

Verification

  • nix build .#docker-vm -o /tmp/docker-vm-issue-34-result passed; its check phase runs the Rust unit tests.
  • python3 -m py_compile tests/file_sharing_e2e.py and git diff --check passed.
  • Full private-Xvfb run against the final Nix output exited 0:
PASS #26 1/8/9: GPU Wayland + native H.264, hot folder 0.06s, same container, Thunar opened file and remote title drag changed 18789 pixels, owner-only RO FUSE
PASS #26 3: native Unmount removed folder with the same container ID
PASS #26 5: SIGTERM removed GPU container, runtime mount directory and project FUSE mounts
PASS #26 3/6: CPU X fallback hot-mounted and unmounted without restart; busy open file produced an error and remained mounted
PASS #26 4/6: CPU File → Quit removed container and FUSE mounts
PASS #26 10 Off/override: no drop-zone bind; File menu disabled; saved rw overridden by DOCKER_VM_FILE_SHARING=off
PASS #26 4: File → Quit removed container and runtime mount directory
PASS #26 2/10/11: AES ZIP prompted twice after wrong password, read decrypted content, saved path without password
PASS #26 10 Encrypted: native menu offered only encrypted archive; plain and mixed ZIPs were refused
PASS #26 11: saved ZIP stayed inactive after relaunch, Recent mounted it after a fresh password prompt, Forget all cleared it
PASS #26 10 Read & write: default folder was RO; Allow changes wrote host-owned nonexecutable file; symlink and .. escapes failed
PASS #26 7: viewer started under private mount namespace; File → Mount showed propagation reason and no drop-zone bind
PASS #26 10 transition Off → Read-only: Settings saved RO while running Off; no bind appeared before Restart session
PASS #26 10 transition Read-only → Read & write: Settings saved RW; drop-zone bind stayed RO until Restart session
PASS #26 10 transition Read & write → Read-only: existing mount stayed active; saved writable share became disabled immediately
PASS #26 10 transition any → Off: live share unmounted immediately and Mount became disabled

The GPU hot folder appeared in 0.06 s. The driver confirmed a native H.264 first frame, unchanged container ID, a visible Thunar window, and a successful remote title drag. The read-only parent bind was also tested live with a writable child: container-created files appeared on the host with the host UID and no executable bits, while .., symlink escapes, and chmod of the parent failed.

@zackees
zackees merged commit d79a285 into main Oct 18, 2026
1 check passed
@zackees
zackees deleted the feat/issue-34-acceptance-driver branch October 18, 2026 02:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Sharing 8/8: End-to-end acceptance driver + docs

1 participant