Make one of the AttributeSet ctors maintain the invariant that the
[oota-llvm.git] / unittests / Support / ProgramTest.cpp
old mode 100755 (executable)
new mode 100644 (file)
index 9dd9ccd..6852ca6
@@ -8,11 +8,21 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Support/CommandLine.h"
+#include "llvm/Support/FileSystem.h"
 #include "llvm/Support/Path.h"
 #include "llvm/Support/Program.h"
 #include "gtest/gtest.h"
 
 #include <stdlib.h>
+#if defined(__APPLE__)
+# include <crt_externs.h>
+#elif !defined(_MSC_VER)
+// Forward declare environ in case it's not provided by stdlib.h.
+extern char **environ;
+#endif
+
+// From TestMain.cpp.
+extern const char *TestMainArgv0;
 
 namespace {
 
@@ -25,8 +35,12 @@ static cl::opt<std::string>
 ProgramTestStringArg2("program-test-string-arg2");
 
 static void CopyEnvironment(std::vector<const char *> &out) {
-  // environ appears to be pretty portable.
+#ifdef __APPLE__
+  char **envp = *_NSGetEnviron();
+#else
+  // environ seems to work for Windows and most other Unices.
   char **envp = environ;
+#endif
   while (*envp != 0) {
     out.push_back(*envp);
     ++envp;
@@ -42,9 +56,8 @@ TEST(ProgramTest, CreateProcessTrailingSlash) {
     exit(1);
   }
 
-  // FIXME: Hardcoding argv0 here since I don't know a good cross-platform way
-  // to get it.  Maybe ParseCommandLineOptions() should save it?
-  Path my_exe = Path::GetMainExecutable("SupportTests", &ProgramTestStringArg1);
+  std::string my_exe =
+      sys::fs::getMainExecutable(TestMainArgv0, &ProgramTestStringArg1);
   const char *argv[] = {
     my_exe.c_str(),
     "--gtest_filter=ProgramTest.CreateProcessTrailingSlashChild",
@@ -63,14 +76,14 @@ TEST(ProgramTest, CreateProcessTrailingSlash) {
   bool ExecutionFailed;
   // Redirect stdout and stdin to NUL, but let stderr through.
 #ifdef LLVM_ON_WIN32
-  Path nul("NUL");
+  StringRef nul("NUL");
 #else
-  Path nul("/dev/null");
+  StringRef nul("/dev/null");
 #endif
-  const Path *redirects[] = { &nul, &nul, 0 };
-  int rc = Program::ExecuteAndWait(my_exe, argv, &envp[0], redirects,
-                                   /*secondsToWait=*/10, /*memoryLimit=*/0,
-                                   &error, &ExecutionFailed);
+  const StringRef *redirects[] = { &nul, &nul, 0 };
+  int rc = ExecuteAndWait(my_exe, argv, &envp[0], redirects,
+                          /*secondsToWait=*/ 10, /*memoryLimit=*/ 0, &error,
+                          &ExecutionFailed);
   EXPECT_FALSE(ExecutionFailed) << error;
   EXPECT_EQ(0, rc);
 }