From 389273a24f317721f364f3957cf4d5dff977d415 Mon Sep 17 00:00:00 2001 From: Sebastian Messmer Date: Tue, 21 Jun 2016 17:36:29 -0700 Subject: [PATCH] Test cases use a fake home directory for their configuration, so they don't clutter the actual home directory. --- src/cpp-utils/system/homedir.cpp | 30 +++++++++++++++-- src/cpp-utils/system/homedir.h | 32 ++++++++++++++++++- src/cryfs/filesystem/CryDevice.cpp | 2 +- test/cryfs/filesystem/CryFsTest.cpp | 5 ++- test/cryfs/filesystem/FileSystemTest.cpp | 3 +- test/cryfs/filesystem/testutils/CryTestBase.h | 3 +- .../testutils/TestWithFakeHomeDirectory.h | 19 +++++++++++ 7 files changed, 87 insertions(+), 7 deletions(-) create mode 100644 test/cryfs/testutils/TestWithFakeHomeDirectory.h diff --git a/src/cpp-utils/system/homedir.cpp b/src/cpp-utils/system/homedir.cpp index 9e07463a..0fc943b0 100644 --- a/src/cpp-utils/system/homedir.cpp +++ b/src/cpp-utils/system/homedir.cpp @@ -4,10 +4,26 @@ namespace bf = boost::filesystem; using std::string; +using cpputils::unique_ref; +using cpputils::make_unique_ref; namespace cpputils { namespace system { - bf::path home_directory() { + + HomeDirectory::HomeDirectory() + :_home_directory(_get_home_directory()) { + } + + HomeDirectory &HomeDirectory::singleton() { + static HomeDirectory _singleton; + return _singleton; + } + + const bf::path &HomeDirectory::get() { + return singleton()._home_directory; + } + + bf::path HomeDirectory::_get_home_directory() { struct passwd* pwd = getpwuid(getuid()); string homedir; if (pwd) { @@ -21,5 +37,15 @@ namespace cpputils { } return homedir; } + + FakeHomeDirectoryRAII::FakeHomeDirectoryRAII(const boost::filesystem::path &fakeHomeDirectory) + :_oldHomeDirectory(HomeDirectory::singleton()._home_directory) { + HomeDirectory::singleton()._home_directory = fakeHomeDirectory; + } + + FakeHomeDirectoryRAII::~FakeHomeDirectoryRAII() { + // Reset to old (non-fake) value + HomeDirectory::singleton()._home_directory = _oldHomeDirectory; + } } -} \ No newline at end of file +} diff --git a/src/cpp-utils/system/homedir.h b/src/cpp-utils/system/homedir.h index 3c8888c8..63c7f542 100644 --- a/src/cpp-utils/system/homedir.h +++ b/src/cpp-utils/system/homedir.h @@ -3,11 +3,41 @@ #define MESSMER_CPPUTILS_SYSTEM_GETTOTALMEMORY_H #include +#include "../macros.h" +#include namespace cpputils { namespace system { - boost::filesystem::path home_directory(); + class FakeHomeDirectoryRAII; + + class HomeDirectory final { + public: + static const boost::filesystem::path &get(); + + private: + boost::filesystem::path _home_directory; + + HomeDirectory(); + static HomeDirectory &singleton(); + boost::filesystem::path _get_home_directory(); + + friend class FakeHomeDirectoryRAII; + + DISALLOW_COPY_AND_ASSIGN(HomeDirectory); + }; + + + class FakeHomeDirectoryRAII final { + public: + FakeHomeDirectoryRAII(const boost::filesystem::path &fakeHomeDirectory); + ~FakeHomeDirectoryRAII(); + + private: + boost::filesystem::path _oldHomeDirectory; + + DISALLOW_COPY_AND_ASSIGN(FakeHomeDirectoryRAII); + }; } } diff --git a/src/cryfs/filesystem/CryDevice.cpp b/src/cryfs/filesystem/CryDevice.cpp index 20d0ab15..928426e5 100644 --- a/src/cryfs/filesystem/CryDevice.cpp +++ b/src/cryfs/filesystem/CryDevice.cpp @@ -76,7 +76,7 @@ Key CryDevice::CreateRootBlobAndReturnKey() { } bf::path CryDevice::_integrityFilePath(const CryConfig::FilesystemID &filesystemId) { - bf::path app_dir = cpputils::system::home_directory() / ".cryfs"; + bf::path app_dir = cpputils::system::HomeDirectory::get() / ".cryfs"; _createDirIfNotExists(app_dir); bf::path filesystems_dir = app_dir / "filesystems"; _createDirIfNotExists(filesystems_dir); diff --git a/test/cryfs/filesystem/CryFsTest.cpp b/test/cryfs/filesystem/CryFsTest.cpp index d80995e3..d12585e0 100644 --- a/test/cryfs/filesystem/CryFsTest.cpp +++ b/test/cryfs/filesystem/CryFsTest.cpp @@ -9,6 +9,8 @@ #include #include "../testutils/MockConsole.h" #include +#include +#include "../testutils/TestWithFakeHomeDirectory.h" //TODO (whole project) Make constructors explicit when implicit construction not needed @@ -24,13 +26,14 @@ using cpputils::Console; using cpputils::Random; using cpputils::SCrypt; using cpputils::Data; +using cpputils::system::FakeHomeDirectoryRAII; using blockstore::ondisk::OnDiskBlockStore; using boost::none; namespace bf = boost::filesystem; using namespace cryfs; -class CryFsTest: public Test, public TestWithMockConsole { +class CryFsTest: public Test, public TestWithMockConsole, public TestWithFakeHomeDirectory { public: CryFsTest(): rootdir(), config(false) { } diff --git a/test/cryfs/filesystem/FileSystemTest.cpp b/test/cryfs/filesystem/FileSystemTest.cpp index e4b0681d..da10ef23 100644 --- a/test/cryfs/filesystem/FileSystemTest.cpp +++ b/test/cryfs/filesystem/FileSystemTest.cpp @@ -5,6 +5,7 @@ #include #include #include "../testutils/MockConsole.h" +#include "../testutils/TestWithFakeHomeDirectory.h" using cpputils::unique_ref; using cpputils::make_unique_ref; @@ -19,7 +20,7 @@ using blockstore::testfake::FakeBlockStore; using namespace cryfs; -class CryFsTestFixture: public FileSystemTestFixture, public TestWithMockConsole { +class CryFsTestFixture: public FileSystemTestFixture, public TestWithMockConsole, public TestWithFakeHomeDirectory { public: CryFsTestFixture() // Don't create config tempfile yet diff --git a/test/cryfs/filesystem/testutils/CryTestBase.h b/test/cryfs/filesystem/testutils/CryTestBase.h index a232d700..3dd12588 100644 --- a/test/cryfs/filesystem/testutils/CryTestBase.h +++ b/test/cryfs/filesystem/testutils/CryTestBase.h @@ -5,8 +5,9 @@ #include #include #include +#include "../../testutils/TestWithFakeHomeDirectory.h" -class CryTestBase { +class CryTestBase : public TestWithFakeHomeDirectory { public: CryTestBase(): _configFile(false), _device(nullptr) { auto fakeBlockStore = cpputils::make_unique_ref(); diff --git a/test/cryfs/testutils/TestWithFakeHomeDirectory.h b/test/cryfs/testutils/TestWithFakeHomeDirectory.h new file mode 100644 index 00000000..a0fef63e --- /dev/null +++ b/test/cryfs/testutils/TestWithFakeHomeDirectory.h @@ -0,0 +1,19 @@ +#pragma once +#ifndef MESSMER_CRYFS_TEST_TESTUTILS_TESTWITHFAKEHOMEDIRECTORY_H +#define MESSMER_CRYFS_TEST_TESTUTILS_TESTWITHFAKEHOMEDIRECTORY_H + +#include +#include + +class TestWithFakeHomeDirectory { +public: + TestWithFakeHomeDirectory() + :homedir(), fakeHomeDirRAII(homedir.path()) { + } + +private: + cpputils::TempDir homedir; + cpputils::system::FakeHomeDirectoryRAII fakeHomeDirRAII; +}; + +#endif