EnvVarSaver.
authorYedidya Feldblum <yfeldblum@fb.com>
Tue, 18 Aug 2015 09:09:11 +0000 (02:09 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Tue, 18 Aug 2015 09:20:19 +0000 (02:20 -0700)
Summary: [Folly] EnvVarSaver.

    TEST(SomeBigClassTest, ChangesEnvVars) {
      folly::EnvVarSaver saver;
      setenv("USER", "root", 1);
      BigClass().doSomethingWithUser();
    }

Reviewed By: @Gownta

Differential Revision: D2354679

folly/experimental/TestUtil.cpp
folly/experimental/TestUtil.h
folly/experimental/test/TestUtilTest.cpp

index ae84cc3166265744508beb2199d77f676a5cd8dd..4ff1cf32cbdced29eb8fb52b96dde7619a79153c 100644 (file)
@@ -26,6 +26,7 @@
 #include <folly/Exception.h>
 #include <folly/File.h>
 #include <folly/FileUtil.h>
 #include <folly/Exception.h>
 #include <folly/File.h>
 #include <folly/FileUtil.h>
+#include <folly/String.h>
 
 namespace folly {
 namespace test {
 
 namespace folly {
 namespace test {
@@ -179,5 +180,35 @@ std::string CaptureFD::readIncremental() {
   return std::string(buf.get(), size);
 }
 
   return std::string(buf.get(), size);
 }
 
+static std::map<std::string, std::string> getEnvVarMap() {
+  std::map<std::string, std::string> data;
+  for (auto it = environ; *it != nullptr; ++it) {
+    std::string key, value;
+    split("=", *it, key, value);
+    if (key.empty()) {
+      continue;
+    }
+    CHECK(!data.count(key)) << "already contains: " << key;
+    data.emplace(move(key), move(value));
+  }
+  return data;
+}
+
+EnvVarSaver::EnvVarSaver() {
+  saved_ = getEnvVarMap();
+}
+
+EnvVarSaver::~EnvVarSaver() {
+  for (const auto& kvp : getEnvVarMap()) {
+    if (saved_.count(kvp.first)) {
+      continue;
+    }
+    PCHECK(0 == unsetenv(kvp.first.c_str()));
+  }
+  for (const auto& kvp : saved_) {
+    PCHECK(0 == setenv(kvp.first.c_str(), kvp.second.c_str(), (int)true));
+  }
+}
+
 }  // namespace test
 }  // namespace folly
 }  // namespace test
 }  // namespace folly
index dbf847686004bfb6f438e46a1bc02e91c8b94012..e1bd1b9b59885528d1880f8b148393eea5e04781 100644 (file)
@@ -17,6 +17,7 @@
 #ifndef FOLLY_TESTUTIL_H_
 #define FOLLY_TESTUTIL_H_
 
 #ifndef FOLLY_TESTUTIL_H_
 #define FOLLY_TESTUTIL_H_
 
+#include <map>
 #include <string>
 #include <folly/Range.h>
 #include <folly/experimental/io/FsUtil.h>
 #include <string>
 #include <folly/Range.h>
 #include <folly/experimental/io/FsUtil.h>
@@ -191,6 +192,14 @@ private:
   off_t readOffset_;  // for incremental reading
 };
 
   off_t readOffset_;  // for incremental reading
 };
 
+class EnvVarSaver {
+public:
+  EnvVarSaver();
+  ~EnvVarSaver();
+private:
+  std::map<std::string, std::string> saved_;
+};
+
 }  // namespace test
 }  // namespace folly
 
 }  // namespace test
 }  // namespace folly
 
index d434c9b735326a1ff01739cc63f4376aac331bd0..af42a0cadbf1ccb3f4aed45862c6beb410a90912 100644 (file)
@@ -23,6 +23,7 @@
 #include <system_error>
 
 #include <boost/algorithm/string.hpp>
 #include <system_error>
 
 #include <boost/algorithm/string.hpp>
+#include <folly/Memory.h>
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
 #include <glog/logging.h>
 #include <gtest/gtest.h>
 
@@ -135,6 +136,43 @@ TEST(CaptureFD, GlogPatterns) {
   }
 }
 
   }
 }
 
+class EnvVarSaverTest : public testing::Test {};
+
+TEST_F(EnvVarSaverTest, ExampleNew) {
+  auto key = "hahahahaha";
+  EXPECT_EQ(nullptr, getenv(key));
+
+  auto saver = make_unique<EnvVarSaver>();
+  PCHECK(0 == setenv(key, "blah", true));
+  EXPECT_EQ("blah", std::string{getenv(key)});
+  saver = nullptr;
+  EXPECT_EQ(nullptr, getenv(key));
+}
+
+TEST_F(EnvVarSaverTest, ExampleExisting) {
+  auto key = "USER";
+  EXPECT_NE(nullptr, getenv(key));
+  auto value = std::string{getenv(key)};
+
+  auto saver = make_unique<EnvVarSaver>();
+  PCHECK(0 == setenv(key, "blah", true));
+  EXPECT_EQ("blah", std::string{getenv(key)});
+  saver = nullptr;
+  EXPECT_TRUE(value == getenv(key));
+}
+
+TEST_F(EnvVarSaverTest, ExampleDeleting) {
+  auto key = "USER";
+  EXPECT_NE(nullptr, getenv(key));
+  auto value = std::string{getenv(key)};
+
+  auto saver = make_unique<EnvVarSaver>();
+  PCHECK(0 == unsetenv(key));
+  EXPECT_EQ(nullptr, getenv(key));
+  saver = nullptr;
+  EXPECT_TRUE(value == getenv(key));
+}
+
 int main(int argc, char *argv[]) {
   testing::InitGoogleTest(&argc, argv);
   gflags::ParseCommandLineFlags(&argc, &argv, true);
 int main(int argc, char *argv[]) {
   testing::InitGoogleTest(&argc, argv);
   gflags::ParseCommandLineFlags(&argc, &argv, true);