diff --git a/tests/unistd_test.cpp b/tests/unistd_test.cpp index f56c5da21..70b23bd75 100644 --- a/tests/unistd_test.cpp +++ b/tests/unistd_test.cpp @@ -132,3 +132,111 @@ TEST(unistd, _exit) { ASSERT_TRUE(WIFEXITED(status)); ASSERT_EQ(99, WEXITSTATUS(status)); } + +TEST(unistd, getenv_unsetenv) { + ASSERT_EQ(0, setenv("test-variable", "hello", 1)); + ASSERT_STREQ("hello", getenv("test-variable")); + ASSERT_EQ(0, unsetenv("test-variable")); + ASSERT_TRUE(getenv("test-variable") == NULL); +} + +TEST(unistd, unsetenv_EINVAL) { + EXPECT_EQ(-1, unsetenv(NULL)); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, unsetenv("")); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, unsetenv("a=b")); + EXPECT_EQ(EINVAL, errno); +} + +TEST(unistd, setenv_EINVAL) { + EXPECT_EQ(-1, setenv(NULL, "value", 0)); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, setenv(NULL, "value", 1)); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, setenv("", "value", 0)); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, setenv("", "value", 1)); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, setenv("a=b", "value", 0)); + EXPECT_EQ(EINVAL, errno); + EXPECT_EQ(-1, setenv("a=b", "value", 1)); + EXPECT_EQ(EINVAL, errno); +} + +TEST(unistd, setenv) { + ASSERT_EQ(0, unsetenv("test-variable")); + + char a[] = "a"; + char b[] = "b"; + char c[] = "c"; + + // New value. + EXPECT_EQ(0, setenv("test-variable", a, 0)); + EXPECT_STREQ(a, getenv("test-variable")); + + // Existing value, no overwrite. + EXPECT_EQ(0, setenv("test-variable", b, 0)); + EXPECT_STREQ(a, getenv("test-variable")); + + // Existing value, overwrite. + EXPECT_EQ(0, setenv("test-variable", c, 1)); + EXPECT_STREQ(c, getenv("test-variable")); + // But the arrays backing the values are unchanged. + EXPECT_EQ('a', a[0]); + EXPECT_EQ('b', b[0]); + EXPECT_EQ('c', c[0]); + + ASSERT_EQ(0, unsetenv("test-variable")); +} + +TEST(unistd, putenv) { + ASSERT_EQ(0, unsetenv("a")); + + char* s1 = strdup("a=b"); + ASSERT_EQ(0, putenv(s1)); + + ASSERT_STREQ("b", getenv("a")); + s1[2] = 'c'; + ASSERT_STREQ("c", getenv("a")); + + char* s2 = strdup("a=b"); + ASSERT_EQ(0, putenv(s2)); + + ASSERT_STREQ("b", getenv("a")); + ASSERT_EQ('c', s1[2]); + + ASSERT_EQ(0, unsetenv("a")); + free(s1); + free(s2); +} + +TEST(unistd, clearenv) { + extern char** environ; + + // Guarantee that environ is not initially empty... + ASSERT_EQ(0, setenv("test-variable", "a", 1)); + + // Stash a copy. + std::vector old_environ; + for (size_t i = 0; environ[i] != NULL; ++i) { + old_environ.push_back(strdup(environ[i])); + } + + ASSERT_EQ(0, clearenv()); + + EXPECT_TRUE(environ == NULL || environ[0] == NULL); + EXPECT_EQ(NULL, getenv("test-variable")); + EXPECT_EQ(0, setenv("test-variable", "post-clear", 1)); + EXPECT_STREQ("post-clear", getenv("test-variable")); + + // Put the old environment back. + for (size_t i = 0; i < old_environ.size(); ++i) { + EXPECT_EQ(0, putenv(old_environ[i])); + } + + // Check it wasn't overwritten. + EXPECT_STREQ("a", getenv("test-variable")); + + EXPECT_EQ(0, unsetenv("test-variable")); +}