/* * 975_dirs_run — execute the lib/dirs @test fixture under the C-side * `ww run` driver and assert exit 0. * * Workflow: * 1. mkdtemp /tmp/wwdirs-XXXXXX — fresh per run, no cross-run * stale state, no parallel-test conflicts. * 2. setenv the four cohort env states (see lib/dirs/dirstest.ww * file header for the contract). * 3. exec `ww run lib/dirs/dirstest.ww`. The fixture reads * WW_TEST_TMPDIR + the XDG_/HOME envs and asserts. * 4. system("rm -rf ") to reclaim the tmpdir + the * auto-created child dirs (dirs.* mkdir-recursive on the way * down, so the directory tree is non-empty by test exit). * * Same wrapper shape as 970-974; cleanup-on-failure is rm-rf'd so a * test failure never leaves residue in /tmp. */ #include #include #include #include #include static int runwait(const char *cmd) { int rc = system(cmd); if (rc == -1) return -1; if (WIFEXITED(rc)) return WEXITSTATUS(rc); return 1; } int main(void) { const char *bin = getenv("BIN"); if (!bin) bin = "out/bin"; char absbin[1024]; if (bin[0] != '/') { char cwd[1024]; if (getcwd(cwd, sizeof cwd) == NULL) return 1; snprintf(absbin, sizeof absbin, "%s/%s", cwd, bin); bin = absbin; } char cwd[1024]; if (getcwd(cwd, sizeof cwd) == NULL) return 1; /* mkdtemp the per-run scratch root. */ char tmpl[64]; strcpy(tmpl, "/tmp/wwdirs-XXXXXX"); if (mkdtemp(tmpl) == NULL) { perror("mkdtemp"); return 1; } /* Pre-arrange env. The child `ww run` inherits these. */ char cfg[128]; snprintf(cfg, sizeof cfg, "%s/cfg", tmpl); setenv("HOME", tmpl, 1); setenv("XDG_CONFIG_HOME", cfg, 1); setenv("XDG_CACHE_HOME", "relative/path", 1); /* non-abs → fallback */ unsetenv("XDG_DATA_HOME"); unsetenv("XDG_STATE_HOME"); setenv("WW_TEST_TMPDIR", tmpl, 1); const char *src = "lib/dirs/dirstest.ww"; char path[1024], cmd[2048]; snprintf(path, sizeof path, "%s/%s", cwd, src); snprintf(cmd, sizeof cmd, "%s/ww test %s", bin, path); int rc = runwait(cmd); /* Cleanup regardless of pass/fail — no residue under /tmp. */ char rmcmd[256]; snprintf(rmcmd, sizeof rmcmd, "rm -rf %s", tmpl); (void)system(rmcmd); if (rc != 0) { fprintf(stderr, "dirs_run FAIL: %s exited %d\n", src, rc); return 1; } printf("dirs_run: %s ok\n", src); return 0; }