1 /*
2  * Copyright (c) 2025 Tenstorrent AI ULC
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #include <errno.h>
7 #include <stdlib.h>
8 
9 #include <zephyr/ztest.h>
10 
ZTEST(xsi_single_process,test_putenv)11 ZTEST(xsi_single_process, test_putenv)
12 {
13 	char buf[64];
14 
15 	{
16 		/* degenerate cases */
17 		static const char *const cases[] = {
18 			NULL, "", "=", "abc", "42", "=abc",
19 			/*
20 			 * Note:
21 			 * There are many poorly-formatted environment variable names and values
22 			 * that are invalid (from the perspective of a POSIX shell), but still
23 			 * accepted by setenv() and subsequently putenv().
24 			 *
25 			 * See also tests/posix/single_process/src/env.c
26 			 * See also lib/posix/shell/env.c:101
27 			 */
28 		};
29 
30 		ARRAY_FOR_EACH(cases, i) {
31 			char *s;
32 
33 			if (cases[i] == NULL) {
34 				s = NULL;
35 			} else {
36 				strncpy(buf, cases[i], sizeof(buf));
37 				buf[sizeof(buf) - 1] = '\0';
38 				s = buf;
39 			}
40 
41 			errno = 0;
42 			zexpect_equal(-1, putenv(s), "putenv(%s) unexpectedly succeeded", s);
43 			zexpect_not_equal(0, errno, "putenv(%s) did not set errno", s);
44 		}
45 	}
46 
47 	{
48 		/* valid cases */
49 		static const char *const cases[] = {
50 			"FOO=bar",
51 		};
52 
53 		ARRAY_FOR_EACH(cases, i) {
54 			strncpy(buf, cases[i], sizeof(buf));
55 			buf[sizeof(buf) - 1] = '\0';
56 
57 			zexpect_ok(putenv(buf), "putenv(%s) failed: %d", buf, errno);
58 		}
59 	}
60 }
61