/* * 974_getenv_run — execute the lib/os getenv smoke fixture under the * C-side `ww run` driver and assert exit 0. * * Pre-arranges the environment that lib/os/os_test.ww asserts against: * * WW_TEST_GETENV = "hello-world" (set, non-empty) * WW_TEST_EMPTY = "" (set, empty value) * WW_TEST_NOT_SET unset (unsetenv-cleared) * * The child `ww run` process inherits this env, so os_test.ww's * `os.getenv` calls see exactly the state we configured here. This * is the "C-side env arrangement" pattern (parent sets, child reads) * — proper POSIX shape for stdlib testing without a `setenv` ww * primitive (deferred per drew/rob). * * Same wrapper shape as 970_fmt_run / 971_log_run / 972_fnmatch_run * / 973_shlex_run. */ #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; /* Pre-arrange the env state os_test.ww asserts against. */ setenv("WW_TEST_GETENV", "hello-world", 1); setenv("WW_TEST_EMPTY", "", 1); unsetenv("WW_TEST_NOT_SET"); const char *src = "lib/os/os_test.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); if (rc != 0) { fprintf(stderr, "getenv_run FAIL: %s exited %d\n", src, rc); return 1; } printf("getenv_run: %s ok\n", src); return 0; }