From cd4ca7c4d9294cc9046a749e5f0d977fb3496329 Mon Sep 17 00:00:00 2001 From: Test Date: Sat, 30 May 2026 20:01:58 +0000 Subject: [PATCH] tests: record AFP delete smoke success --- TODO.md | 32 ++++++++++++++--------- tests/linux/README.md | 61 ++++++++++++++++++++++++++++++------------- 2 files changed, 62 insertions(+), 31 deletions(-) diff --git a/TODO.md b/TODO.md index f1710ed..87702f7 100644 --- a/TODO.md +++ b/TODO.md @@ -332,15 +332,18 @@ Current status: NetWare volume, not transport-level AFP proxy calls to `afpd`. - AFP Get DOS Name From Entry ID (0x12) is implemented as a conservative read-only reverse lookup that first uses the existing mars_nwe - `map_directory_number_to_path()` namespace/basehandle path. The old - `nwatalk_get_entry_id()` volume scan remains only as a legacy fallback for - cached AFP IDs. The latest smoke run confirmed `entry_id=0x00000004` - resolving to `PUBLIC/PMDFLTS.INI`. + `map_directory_number_to_path()` namespace/basehandle path for directory + objects. Regular file Entry IDs stay on the cached AFP/fallback path until a + reliable file-object reverse mapper is available. The legacy + `nwatalk_get_entry_id()` volume scan remains as the fallback for cached AFP + file IDs. Follow-up: - Implement the NetWare AFP NCP calls locally, using libatalk helpers rather - than proxying requests to `afpd`. + than proxying requests to `afpd`. Create Directory, Create File, and AFP + Delete are now implemented through existing mars_nwe create/remove helpers + and covered by Linux smoke tests. - Candidate libatalk pieces include the new AppleDouble/Finder Info/resource fork helper wrappers, plus future CNID/directory-id helpers, attribute mapping, and filename conversion. @@ -352,15 +355,18 @@ Follow-up: future libatalk/CNID backend may still provide Apple-native identity, but AFP must not grow a second mars_nwe object-id resolver in parallel to the existing namespace machinery. -- The full smoke suite verifies namespace-derived identity end to end: +- The full smoke suite verifies path-backed file identity end to end: Entry ID From Path Name, Entry ID From NetWare Handle, Get File Information, - Scan File Information, Set File Information verification, and Get DOS Name - From Entry ID all returned or consumed `entry_id=0x00000004` for the sample - `SYS:PUBLIC/pmdflts.ini` path, with `failures=0`. AFP directory-scan - continuation remains directory iteration based: `last_seen` skips past the - previously returned object, but the next returned Entry ID is not required to - be numerically greater than the continuation token. FinderInfo plus the - Finder Hidden/System/Archive AFP attributes now have + Set File Information verification, and Get DOS Name From Entry ID all returned + or consumed a cached AFP/fallback file ID for the sample + `SYS:PUBLIC/pmdflts.ini` path, while directory-scan entries continue to use + the existing namespace/basehandle identity. AFP directory-scan continuation + remains directory iteration based: `last_seen` skips past the previously + returned object, but the next returned Entry ID is not required to be + numerically greater than the continuation token. The latest full smoke run + also verified AFP Delete cleanup for Create Directory and Create File and + ended with `failures=0`. FinderInfo plus the Finder Hidden/System/Archive + AFP attributes now have deliberately narrow write paths through AFP Set File Information `0x09` and AFP 2.0 Set File Information `0x10`; CNID allocation and broader AFP metadata writes still need a deliberate write-safe diff --git a/tests/linux/README.md b/tests/linux/README.md index 9559633..bfbdec0 100644 --- a/tests/linux/README.md +++ b/tests/linux/README.md @@ -215,12 +215,11 @@ Example: ``` The full smoke suite creates temporary directories under the tested parent using -fresh short DOS-compatible leaf names by default. Local removal is best-effort: -AFP Delete is not implemented yet, and the script often runs as an unprivileged -Unix user while the server created the directory under its own identity. Use -`--create-dir-name NAME` to override the default temporary leaf name, knowing -that rerunning with the same explicit name may fail if a previous directory still -exists. +fresh short DOS-compatible leaf names by default. It now uses the AFP Delete +endpoint for both pre-test cleanup and post-create cleanup, so the smoke no +longer depends on local Unix `rmdir` permissions when the server created the +directory under its own identity. Use `--create-dir-name NAME` to override the +default temporary leaf name. ## AFP Create File smoke test @@ -247,19 +246,45 @@ Example: ``` The full smoke suite creates temporary files under the tested parent with fresh -short DOS-compatible leaf names by default. Local removal is best-effort, just -like the create-directory smoke, because the suite usually runs as an -unprivileged Unix user while mars_nwe creates the file as the server-side -identity. Use `--create-file-name NAME` to override the default leaf name; -rerunning with the same explicit name may fail if a previous file still exists. +short DOS-compatible leaf names by default. It now uses AFP Delete for both +pre-test cleanup and post-create cleanup, avoiding local Unix `rm` permission +assumptions when mars_nwe creates the file as the server-side identity. Use +`--create-file-name NAME` to override the default leaf name. -Runtime status: the build-server smoke run verified both create-file variants. -Legacy AFP Create File (`0x02`) created `SYS:PUBLIC/atst0` and returned -`0x333bee1c`; AFP 2.0 Create File (`0x0e`) created `SYS:PUBLIC/atst02` and -returned `0x4e329102`. Both IDs were re-read through AFP Entry ID From Path -Name. The overall run still reported `failures=2`, but those failures were the -pre-existing create-directory names `AFPTST0` and `AFPTST02`; the create-file -checks themselves succeeded. +Runtime status: the build-server smoke run verified both create-file variants +with AFP Delete cleanup enabled. Legacy AFP Create File (`0x02`) created +`SYS:PUBLIC/atst0` and returned `0x77ba6113`; AFP 2.0 Create File (`0x0e`) +created `SYS:PUBLIC/atst02` and returned `0x3cd55515`. Both IDs were re-read +through AFP Entry ID From Path Name and then removed through AFP Delete. + + +## AFP Delete smoke test + +`afp_delete_smoke` sends the WebSDK/nwafp.h AFP Delete request through +libncp: + +```text +NCP 0x2222/35/03 AFP Delete +``` + +The helper derives the parent Entry ID with AFP Entry ID From Path Name, sends +only the leaf name to AFP Delete, and verifies that a follow-up Entry ID lookup +for the deleted path no longer succeeds. The server implementation routes +directory removal through the existing mars_nwe directory remove path and file +removal through the existing NetWare delete-file path; it does not use local +Unix `unlink`/`rmdir` calls from the test process. + +Example: + +```sh +./tests/linux/afp_delete_smoke -S MARS -U SUPERVISOR -P secret SYS:PUBLIC/afpfile +``` + +Runtime status: the smoke suite now uses AFP Delete for pre-test cleanup and +post-create cleanup around both Create Directory variants and both Create File +variants. The verified run deleted stale `afptst0`, `afptst02`, `atst0`, and +`atst02` paths, recreated the directory and file pairs, deleted all four +created objects again through AFP Delete, and ended with `failures=0`. ## AFP Entry ID smoke test