| //===----------------------------------------------------------------------===// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| /// | |
| /// \file | |
| /// Integration tests for the POSIX setenv function. | |
| /// | |
| //===----------------------------------------------------------------------===// | |
| #include "src/stdlib/getenv.h" | |
| #include "src/stdlib/setenv.h" | |
| #include "test/IntegrationTest/test.h" | |
| #include <errno.h> | |
| TEST_MAIN([[maybe_unused]] int argc, [[maybe_unused]] char **argv, | |
| [[maybe_unused]] char **envp) { | |
| // Test: Basic | |
| { | |
| // Set a simple environment variable | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("SETENV_TEST_VAR", "test_value", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| // Verify it was set | |
| char *value = LIBC_NAMESPACE::getenv("SETENV_TEST_VAR"); | |
| ASSERT_NE(value, nullptr); | |
| ASSERT_STREQ(value, "test_value"); | |
| } | |
| // Test: OverwriteExisting | |
| { | |
| // Set initial value | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("OVERWRITE_VAR", "original", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("OVERWRITE_VAR"), "original"); | |
| // Overwrite with new value (overwrite = 1) | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("OVERWRITE_VAR", "replaced", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("OVERWRITE_VAR"), "replaced"); | |
| } | |
| // Test: NoOverwriteFlag | |
| { | |
| // Set initial value | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("NO_OVERWRITE_VAR", "original", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("NO_OVERWRITE_VAR"), "original"); | |
| // Try to set with overwrite = 0 (should not change) | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("NO_OVERWRITE_VAR", "ignored", 0), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("NO_OVERWRITE_VAR"), "original"); | |
| // Verify it still works with overwrite = 1 | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("NO_OVERWRITE_VAR", "changed", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("NO_OVERWRITE_VAR"), "changed"); | |
| } | |
| // Note: passing nullptr for name or value is undefined behavior per POSIX. | |
| // The implementation uses LIBC_CRASH_ON_NULLPTR for both, so there is no | |
| // test for that case here. | |
| // Test: EmptyName | |
| { | |
| errno = 0; | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("", "value", 1), -1); | |
| ASSERT_ERRNO_EQ(EINVAL); | |
| } | |
| // Test: NameWithEquals | |
| { | |
| errno = 0; | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("BAD=NAME", "value", 1), -1); | |
| ASSERT_ERRNO_EQ(EINVAL); | |
| } | |
| // Test: EmptyValue | |
| { | |
| // Empty value is valid - just means variable is set to empty string | |
| errno = 0; | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("EMPTY_VALUE_VAR", "", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| char *value = LIBC_NAMESPACE::getenv("EMPTY_VALUE_VAR"); | |
| ASSERT_NE(value, nullptr); | |
| ASSERT_STREQ(value, ""); | |
| } | |
| // Test: MultipleVariables | |
| { | |
| // Set multiple different variables | |
| errno = 0; | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("VAR1", "value1", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("VAR2", "value2", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("VAR3", "value3", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| // Verify all are set correctly | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("VAR1"), "value1"); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("VAR2"), "value2"); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("VAR3"), "value3"); | |
| } | |
| // Test: LongValues | |
| { | |
| // Test with longer strings | |
| const char *long_name = "LONG_VAR_NAME_FOR_TESTING"; | |
| const char *long_value = "This is a fairly long value string to test that " | |
| "setenv handles longer strings correctly without " | |
| "any memory issues or truncation problems"; | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv(long_name, long_value, 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv(long_name), long_value); | |
| } | |
| // Test: SpecialCharacters | |
| { | |
| // Test with special characters in value (but not in name) | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("SPECIAL_CHARS", "!@#$%^&*()", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("SPECIAL_CHARS"), "!@#$%^&*()"); | |
| } | |
| // Test: ReplaceMultipleTimes | |
| { | |
| // Replace the same variable multiple times | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("MULTI_REPLACE", "value1", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("MULTI_REPLACE"), "value1"); | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("MULTI_REPLACE", "value2", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("MULTI_REPLACE"), "value2"); | |
| ASSERT_EQ(LIBC_NAMESPACE::setenv("MULTI_REPLACE", "value3", 1), 0); | |
| ASSERT_ERRNO_SUCCESS(); | |
| ASSERT_STREQ(LIBC_NAMESPACE::getenv("MULTI_REPLACE"), "value3"); | |
| } | |
| return 0; | |
| } |