fall back to .debug_info scan in fatal signal handler
[folly.git] / folly / experimental / test / TestUtilTest.cpp
index 8e69da9c1bafe5ff75db452005c0f321105da74b..79046e0736ea126f8b91f4339a4a45ee192ea61e 100644 (file)
 
 #include <sys/stat.h>
 #include <sys/types.h>
-#include <fcntl.h>
 
 #include <system_error>
 
 #include <boost/algorithm/string.hpp>
-#include <folly/Memory.h>
 #include <glog/logging.h>
-#include <gtest/gtest.h>
+
+#include <folly/Memory.h>
+#include <folly/portability/Environment.h>
+#include <folly/portability/Fcntl.h>
+#include <folly/portability/GTest.h>
 
 using namespace folly;
 using namespace folly::test;
@@ -43,13 +45,15 @@ TEST(TemporaryFile, Simple) {
     EXPECT_EQ(1, r);
   }
 
-  // The file must have been closed.  This assumes that no other thread
-  // has opened another file in the meanwhile, which is a sane assumption
-  // to make in this test.
-  ssize_t r = write(fd, &c, 1);
-  int savedErrno = errno;
-  EXPECT_EQ(-1, r);
-  EXPECT_EQ(EBADF, savedErrno);
+  msvcSuppressAbortOnInvalidParams([&] {
+    // The file must have been closed.  This assumes that no other thread
+    // has opened another file in the meanwhile, which is a sane assumption
+    // to make in this test.
+    ssize_t r = write(fd, &c, 1);
+    int savedErrno = errno;
+    EXPECT_EQ(-1, r);
+    EXPECT_EQ(EBADF, savedErrno);
+  });
 }
 
 TEST(TemporaryFile, Prefix) {
@@ -82,7 +86,7 @@ void testTemporaryDirectory(TemporaryDirectory::Scope scope) {
     EXPECT_TRUE(fs::is_directory(path));
 
     fs::path fp = path / "bar";
-    int fd = open(fp.c_str(), O_RDWR | O_CREAT | O_TRUNC, 0666);
+    int fd = open(fp.string().c_str(), O_RDWR | O_CREAT | O_TRUNC, 0666);
     EXPECT_NE(fd, -1);
     close(fd);
 
@@ -101,6 +105,30 @@ TEST(TemporaryDirectory, DeleteOnDestruction) {
   testTemporaryDirectory(TemporaryDirectory::Scope::DELETE_ON_DESTRUCTION);
 }
 
+void expectTempdirExists(const TemporaryDirectory& d) {
+  EXPECT_FALSE(d.path().empty());
+  EXPECT_TRUE(fs::exists(d.path()));
+  EXPECT_TRUE(fs::is_directory(d.path()));
+}
+
+TEST(TemporaryDirectory, SafelyMove) {
+  std::unique_ptr<TemporaryDirectory> dir;
+  TemporaryDirectory dir2;
+  {
+    auto scope = TemporaryDirectory::Scope::DELETE_ON_DESTRUCTION;
+    TemporaryDirectory d("", "", scope);
+    TemporaryDirectory d2("", "", scope);
+    expectTempdirExists(d);
+    expectTempdirExists(d2);
+
+    dir = folly::make_unique<TemporaryDirectory>(std::move(d));
+    dir2 = std::move(d2);
+  }
+
+  expectTempdirExists(*dir);
+  expectTempdirExists(dir2);
+}
+
 TEST(ChangeToTempDir, ChangeDir) {
   auto pwd1 = fs::current_path();
   {
@@ -117,19 +145,19 @@ TEST(PCREPatternMatch, Simple) {
 }
 
 TEST(CaptureFD, GlogPatterns) {
-  CaptureFD stderr(2);
+  CaptureFD err(fileno(stderr));
   LOG(INFO) << "All is well";
-  EXPECT_NO_PCRE_MATCH(glogErrOrWarnPattern(), stderr.readIncremental());
+  EXPECT_NO_PCRE_MATCH(glogErrOrWarnPattern(), err.readIncremental());
   {
     LOG(ERROR) << "Uh-oh";
-    auto s = stderr.readIncremental();
+    auto s = err.readIncremental();
     EXPECT_PCRE_MATCH(glogErrorPattern(), s);
     EXPECT_NO_PCRE_MATCH(glogWarningPattern(), s);
     EXPECT_PCRE_MATCH(glogErrOrWarnPattern(), s);
   }
   {
     LOG(WARNING) << "Oops";
-    auto s = stderr.readIncremental();
+    auto s = err.readIncremental();
     EXPECT_NO_PCRE_MATCH(glogErrorPattern(), s);
     EXPECT_PCRE_MATCH(glogWarningPattern(), s);
     EXPECT_PCRE_MATCH(glogErrOrWarnPattern(), s);
@@ -139,7 +167,7 @@ TEST(CaptureFD, GlogPatterns) {
 TEST(CaptureFD, ChunkCob) {
   std::vector<std::string> chunks;
   {
-    CaptureFD stderr(2, [&](StringPiece p) {
+    CaptureFD err(fileno(stderr), [&](StringPiece p) {
       chunks.emplace_back(p.str());
       switch (chunks.size()) {
         case 1:
@@ -154,11 +182,11 @@ TEST(CaptureFD, ChunkCob) {
     });
     LOG(INFO) << "foo";
     LOG(INFO) << "bar";
-    EXPECT_PCRE_MATCH(".*foo.*bar.*", stderr.read());
-    auto chunk = stderr.readIncremental();
+    EXPECT_PCRE_MATCH(".*foo.*bar.*", err.read());
+    auto chunk = err.readIncremental();
     EXPECT_EQ(chunks.at(0), chunk);
     LOG(INFO) << "baz";
-    EXPECT_PCRE_MATCH(".*foo.*bar.*baz.*", stderr.read());
+    EXPECT_PCRE_MATCH(".*foo.*bar.*baz.*", err.read());
   }
   EXPECT_EQ(2, chunks.size());
 }
@@ -170,6 +198,11 @@ TEST_F(EnvVarSaverTest, ExampleNew) {
   auto key = "hahahahaha";
   EXPECT_EQ(nullptr, getenv(key));
 
+  PCHECK(0 == setenv(key, "", true));
+  EXPECT_STREQ("", getenv(key));
+  PCHECK(0 == unsetenv(key));
+  EXPECT_EQ(nullptr, getenv(key));
+
   auto saver = make_unique<EnvVarSaver>();
   PCHECK(0 == setenv(key, "blah", true));
   EXPECT_EQ("blah", std::string{getenv(key)});
@@ -178,7 +211,7 @@ TEST_F(EnvVarSaverTest, ExampleNew) {
 }
 
 TEST_F(EnvVarSaverTest, ExampleExisting) {
-  auto key = "USER";
+  auto key = "PATH";
   EXPECT_NE(nullptr, getenv(key));
   auto value = std::string{getenv(key)};
 
@@ -190,7 +223,7 @@ TEST_F(EnvVarSaverTest, ExampleExisting) {
 }
 
 TEST_F(EnvVarSaverTest, ExampleDeleting) {
-  auto key = "USER";
+  auto key = "PATH";
   EXPECT_NE(nullptr, getenv(key));
   auto value = std::string{getenv(key)};