Commit aa1d2adffc

Pat Tullmann <pat.github@tullmann.org>
2025-09-09 07:08:04
standalone posix test for env vars
1 parent 020eb62
Changed files (3)
lib
std
posix
test
standalone
lib/std/posix/test.zig
@@ -607,24 +607,6 @@ test "mmap" {
     }
 }
 
-test "getenv" {
-    if (native_os == .wasi and !builtin.link_libc) {
-        // std.posix.getenv is not supported on WASI due to the need of allocation
-        return error.SkipZigTest;
-    }
-
-    if (native_os == .windows) {
-        try expect(std.process.getenvW(&[_:0]u16{ 'B', 'O', 'G', 'U', 'S', 0x11, 0x22, 0x33, 0x44, 0x55 }) == null);
-    } else {
-        try expect(posix.getenv("") == null);
-        try expect(posix.getenv("BOGUSDOESNOTEXISTENVVAR") == null);
-        if (builtin.link_libc) {
-            try testing.expectEqualStrings(posix.getenv("USER") orelse "", mem.span(std.c.getenv("USER") orelse ""));
-        }
-        try expect(posix.getenvZ("BOGUSDOESNOTEXISTENVVAR") == null);
-    }
-}
-
 test "fcntl" {
     if (native_os == .windows or native_os == .wasi)
         return error.SkipZigTest;
test/standalone/posix/build.zig
@@ -3,6 +3,7 @@ const builtin = @import("builtin");
 
 const Case = struct {
     src_path: []const u8,
+    set_env_vars: bool = false,
 };
 
 const cases = [_]Case{
@@ -11,6 +12,7 @@ const cases = [_]Case{
     },
     .{
         .src_path = "getenv.zig",
+        .set_env_vars = true,
     },
     .{
         .src_path = "sigaction.zig",
@@ -68,5 +70,11 @@ fn run_exe(b: *std.Build, optimize: std.builtin.OptimizeMode, case: *const Case,
 
     const run_cmd = b.addRunArtifact(exe);
 
+    if (case.set_env_vars) {
+        run_cmd.setEnvironmentVariable("ZIG_TEST_POSIX_1EQ", "test=variable");
+        run_cmd.setEnvironmentVariable("ZIG_TEST_POSIX_3EQ", "=test=variable=");
+        run_cmd.setEnvironmentVariable("ZIG_TEST_POSIX_EMPTY", "");
+    }
+
     return run_cmd;
 }
test/standalone/posix/getenv.zig
@@ -1,1 +1,32 @@
-pub fn main() !void {}
+// test getting environment variables
+
+const std = @import("std");
+const builtin = @import("builtin");
+
+pub fn main() !void {
+    if (builtin.target.os.tag == .windows) {
+        return; // Windows env strings are WTF-16, so not supported by Zig's std.posix.getenv()
+    }
+
+    if (builtin.target.os.tag == .wasi and !builtin.link_libc) {
+        return; // std.posix.getenv is not supported on WASI due to the need of allocation
+    }
+
+    // Test some unset env vars:
+
+    try std.testing.expectEqual(std.posix.getenv(""), null);
+    try std.testing.expectEqual(std.posix.getenv("BOGUSDOESNOTEXISTENVVAR"), null);
+    try std.testing.expectEqual(std.posix.getenvZ("BOGUSDOESNOTEXISTENVVAR"), null);
+
+    if (builtin.link_libc) {
+        // Test if USER matches what C library sees
+        const expected = std.mem.span(std.c.getenv("USER") orelse "");
+        const actual = std.posix.getenv("USER") orelse "";
+        try std.testing.expectEqualStrings(expected, actual);
+    }
+
+    // env vars set by our build.zig run step:
+    try std.testing.expectEqualStrings("", std.posix.getenv("ZIG_TEST_POSIX_EMPTY") orelse "invalid");
+    try std.testing.expectEqualStrings("test=variable", std.posix.getenv("ZIG_TEST_POSIX_1EQ") orelse "invalid");
+    try std.testing.expectEqualStrings("=test=variable=", std.posix.getenv("ZIG_TEST_POSIX_3EQ") orelse "invalid");
+}