[llvm] r298514 - Make the home_directory test a little more resilient.

Zachary Turner via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 22 09:30:07 PDT 2017


Author: zturner
Date: Wed Mar 22 11:30:06 2017
New Revision: 298514

URL: http://llvm.org/viewvc/llvm-project?rev=298514&view=rev
Log:
Make the home_directory test a little more resilient.

It's possible (albeit strange) for $HOME to intentionally
point somewhere other than the user's home directory as
reported by the password database.  Our test shouldn't fail
in this case.  This patch updates the test to pull directly
from the password database before unsetting $HOME, rather
than comparing the return value of home_directory() to the
original value of the environment variable.

Modified:
    llvm/trunk/unittests/Support/Path.cpp

Modified: llvm/trunk/unittests/Support/Path.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Support/Path.cpp?rev=298514&r1=298513&r2=298514&view=diff
==============================================================================
--- llvm/trunk/unittests/Support/Path.cpp (original)
+++ llvm/trunk/unittests/Support/Path.cpp Wed Mar 22 11:30:06 2017
@@ -28,6 +28,7 @@
 #endif
 
 #ifdef LLVM_ON_UNIX
+#include <pwd.h>
 #include <sys/stat.h>
 #endif
 
@@ -328,23 +329,33 @@ TEST(Support, HomeDirectory) {
   }
 }
 
-#ifndef LLVM_ON_WIN32
+#ifdef LLVM_ON_UNIX
 TEST(Support, HomeDirectoryWithNoEnv) {
-  std::string Original;
-  char const *path = ::getenv("HOME");
-  // Don't try to test if we don't have something to compare against.
-  if (!path)
-    return;
-  Original = path;
+  std::string OriginalStorage;
+  char const *OriginalEnv = ::getenv("HOME");
+  if (OriginalEnv) {
+    // We're going to unset it, so make a copy and save a pointer to the copy
+    // so that we can reset it at the end of the test.
+    OriginalStorage = OriginalEnv;
+    OriginalEnv = OriginalStorage.c_str();
+  }
+
+  // Don't run the test if we have nothing to compare against.
+  struct passwd *pw = getpwuid(getuid());
+  if (!pw || !pw->pw_dir) return;
+
   ::unsetenv("HOME");
+  EXPECT_EQ(nullptr, ::getenv("HOME"));
+  std::string PwDir = pw->pw_dir;
 
   SmallString<128> HomeDir;
   auto status = path::home_directory(HomeDir);
   EXPECT_TRUE(status);
-  EXPECT_EQ(Original, HomeDir);
+  EXPECT_EQ(PwDir, HomeDir);
 
-  // Now put the original environment variable back
-  ::setenv("HOME", Original.c_str(), 1);
+  // Now put the environment back to its original state (meaning that if it was
+  // unset before, we don't reset it).
+  if (OriginalEnv) ::setenv("HOME", OriginalEnv, 1);
 }
 #endif
 




More information about the llvm-commits mailing list