| #include "../../unity/unity.h" |
| #include <stdlib.h> |
| #include <string.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <sys/wait.h> |
| #include <errno.h> |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| static char const **allocated_usvars = NULL; |
|
|
| |
| static void prepare_usvars_list(char const *const *list, size_t count) |
| { |
| |
| if (allocated_usvars) |
| { |
| free((void *)allocated_usvars); |
| allocated_usvars = NULL; |
| } |
|
|
| if (count == 0 || list == NULL) |
| { |
| usvars = NULL; |
| usvars_used = 0; |
| usvars_alloc = 0; |
| return; |
| } |
|
|
| char const **arr = (char const **)malloc(sizeof(char const *) * count); |
| TEST_ASSERT_NOT_NULL(arr); |
| for (size_t i = 0; i < count; i++) |
| arr[i] = list[i]; |
|
|
| usvars = arr; |
| usvars_used = (typeof(usvars_used))count; |
| usvars_alloc = (typeof(usvars_alloc))count; |
| allocated_usvars = arr; |
| } |
|
|
| |
| static char *make_unique_name(const char *prefix) |
| { |
| char buf[128]; |
| static unsigned counter = 0; |
| snprintf(buf, sizeof buf, "%s_%ld_%u", prefix, (long)getpid(), ++counter); |
| return strdup(buf); |
| } |
|
|
| void setUp(void) |
| { |
| |
| if (allocated_usvars) |
| { |
| free((void *)allocated_usvars); |
| allocated_usvars = NULL; |
| } |
| usvars = NULL; |
| usvars_used = 0; |
| usvars_alloc = 0; |
| } |
|
|
| void tearDown(void) |
| { |
| if (allocated_usvars) |
| { |
| free((void *)allocated_usvars); |
| allocated_usvars = NULL; |
| } |
| |
| } |
|
|
| |
| static void test_unset_envvars_single_existing(void) |
| { |
| char *name = make_unique_name("ENV_TEST_ONE"); |
| TEST_ASSERT_NOT_NULL(name); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(0, setenv(name, "value", 1)); |
| TEST_ASSERT_NOT_NULL(getenv(name)); |
|
|
| char const *list[] = { name }; |
| prepare_usvars_list(list, 1); |
|
|
| unset_envvars(); |
|
|
| TEST_ASSERT_NULL(getenv(name)); |
|
|
| free(name); |
| } |
|
|
| |
| static void test_unset_envvars_multiple_existing_and_nonexistent(void) |
| { |
| char *n1 = make_unique_name("ENV_TEST_MULTI1"); |
| char *n2 = make_unique_name("ENV_TEST_MULTI2"); |
| char *n3 = make_unique_name("ENV_TEST_MULTI3_NOEXIST"); |
| TEST_ASSERT_NOT_NULL(n1); |
| TEST_ASSERT_NOT_NULL(n2); |
| TEST_ASSERT_NOT_NULL(n3); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(0, setenv(n1, "v1", 1)); |
| TEST_ASSERT_EQUAL_INT(0, setenv(n2, "v2", 1)); |
| TEST_ASSERT_NOT_NULL(getenv(n1)); |
| TEST_ASSERT_NOT_NULL(getenv(n2)); |
| TEST_ASSERT_NULL(getenv(n3)); |
|
|
| char const *list[] = { n1, n2, n3 }; |
| prepare_usvars_list(list, 3); |
|
|
| unset_envvars(); |
|
|
| TEST_ASSERT_NULL(getenv(n1)); |
| TEST_ASSERT_NULL(getenv(n2)); |
| TEST_ASSERT_NULL(getenv(n3)); |
|
|
| free(n1); |
| free(n2); |
| free(n3); |
| } |
|
|
| |
| static void test_unset_envvars_nonexistent_only(void) |
| { |
| char *name = make_unique_name("ENV_TEST_NOEXIST"); |
| TEST_ASSERT_NOT_NULL(name); |
|
|
| |
| unsetenv(name); |
| TEST_ASSERT_NULL(getenv(name)); |
|
|
| char const *list[] = { name }; |
| prepare_usvars_list(list, 1); |
|
|
| unset_envvars(); |
|
|
| TEST_ASSERT_NULL(getenv(name)); |
|
|
| free(name); |
| } |
|
|
| |
| static void test_unset_envvars_empty_list_noop(void) |
| { |
| char *persist = make_unique_name("ENV_TEST_PERSIST"); |
| TEST_ASSERT_NOT_NULL(persist); |
|
|
| TEST_ASSERT_EQUAL_INT(0, setenv(persist, "keep", 1)); |
| TEST_ASSERT_NOT_NULL(getenv(persist)); |
|
|
| prepare_usvars_list(NULL, 0); |
|
|
| unset_envvars(); |
|
|
| TEST_ASSERT_NOT_NULL(getenv(persist)); |
|
|
| |
| TEST_ASSERT_EQUAL_INT(0, unsetenv(persist)); |
| TEST_ASSERT_NULL(getenv(persist)); |
|
|
| free(persist); |
| } |
|
|
| |
| |
| static void test_unset_envvars_invalid_name_triggers_error(void) |
| { |
| fflush(stdout); |
| fflush(stderr); |
| pid_t pid = fork(); |
| TEST_ASSERT_MESSAGE(pid >= 0, "fork() failed"); |
|
|
| if (pid == 0) |
| { |
| |
| char const *list[] = { "BAD=NAME" }; |
| prepare_usvars_list(list, 1); |
|
|
| |
| unset_envvars(); |
|
|
| |
| _exit(0xEE); |
| } |
|
|
| int status = 0; |
| pid_t w = waitpid(pid, &status, 0); |
| TEST_ASSERT_EQUAL_INT(pid, w); |
| TEST_ASSERT_TRUE(WIFEXITED(status)); |
|
|
| int es = WEXITSTATUS(status); |
| |
| TEST_ASSERT_EQUAL_INT(EXIT_CANCELED, es); |
| } |
|
|
| int main(void) |
| { |
| UNITY_BEGIN(); |
|
|
| RUN_TEST(test_unset_envvars_single_existing); |
| RUN_TEST(test_unset_envvars_multiple_existing_and_nonexistent); |
| RUN_TEST(test_unset_envvars_nonexistent_only); |
| RUN_TEST(test_unset_envvars_empty_list_noop); |
| RUN_TEST(test_unset_envvars_invalid_name_triggers_error); |
|
|
| return UNITY_END(); |
| } |