From 016ef54a73c151e5b2d4e03f9dacac427989f018 Mon Sep 17 00:00:00 2001 From: sfc-gh-tclinkenbeard Date: Sun, 6 Jun 2021 11:25:58 -0700 Subject: [PATCH] Clean up unit test data directory between tests --- fdbserver/ConfigDatabaseUnitTests.actor.cpp | 143 ++++++++++--------- fdbserver/Coordination.actor.cpp | 5 +- fdbserver/SimpleConfigDatabaseNode.actor.cpp | 1 - fdbserver/workloads/UnitTests.actor.cpp | 5 + flow/UnitTest.h | 2 +- 5 files changed, 85 insertions(+), 71 deletions(-) diff --git a/fdbserver/ConfigDatabaseUnitTests.actor.cpp b/fdbserver/ConfigDatabaseUnitTests.actor.cpp index f2d6df5a84..e83d329084 100644 --- a/fdbserver/ConfigDatabaseUnitTests.actor.cpp +++ b/fdbserver/ConfigDatabaseUnitTests.actor.cpp @@ -57,6 +57,7 @@ Value longToValue(int64_t v) { class WriteToTransactionEnvironment { UID id; + std::string dataDir; ConfigTransactionInterface cti; ConfigFollowerInterface cfi; Reference node; @@ -92,8 +93,9 @@ class WriteToTransactionEnvironment { } public: - WriteToTransactionEnvironment() - : id(deterministicRandom()->randomUniqueID()), node(IConfigDatabaseNode::createSimple("./", id)) { + WriteToTransactionEnvironment(std::string const& dataDir) + : id(deterministicRandom()->randomUniqueID()), dataDir(dataDir), + node(IConfigDatabaseNode::createSimple(dataDir, id)) { setup(); } @@ -109,7 +111,7 @@ public: void restartNode() { cfiServer.cancel(); ctiServer.cancel(); - node = IConfigDatabaseNode::createSimple("./", id); + node = IConfigDatabaseNode::createSimple(dataDir, id); setup(); } @@ -122,6 +124,7 @@ public: class ReadFromLocalConfigEnvironment { UID id; + std::string dataDir; LocalConfiguration localConfiguration; Reference const> cbfi; Future consumer; @@ -145,15 +148,16 @@ class ReadFromLocalConfigEnvironment { } public: - ReadFromLocalConfigEnvironment(std::string const& configPath, + ReadFromLocalConfigEnvironment(std::string const& dataDir, + std::string const& configPath, std::map const& manualKnobOverrides) - : id(deterministicRandom()->randomUniqueID()), localConfiguration("./", configPath, manualKnobOverrides, id), - consumer(Never()) {} + : id(deterministicRandom()->randomUniqueID()), dataDir(dataDir), + localConfiguration(dataDir, configPath, manualKnobOverrides, id), consumer(Never()) {} Future setup() { return setup(this); } Future restartLocalConfig(std::string const& newConfigPath) { - localConfiguration = LocalConfiguration("./", newConfigPath, {}, id); + localConfiguration = LocalConfiguration(dataDir, newConfigPath, {}, id); return setup(); } @@ -191,9 +195,10 @@ class LocalConfigEnvironment { } public: - LocalConfigEnvironment(std::string const& configPath, + LocalConfigEnvironment(std::string const& dataDir, + std::string const& configPath, std::map const& manualKnobOverrides = {}) - : readFrom(configPath, manualKnobOverrides) {} + : readFrom(dataDir, configPath, manualKnobOverrides) {} Future setup() { return readFrom.setup(); } Future restartLocalConfig(std::string const& newConfigPath) { return readFrom.restartLocalConfig(newConfigPath); @@ -228,9 +233,9 @@ class BroadcasterToLocalConfigEnvironment { } public: - BroadcasterToLocalConfigEnvironment(std::string const& configPath) + BroadcasterToLocalConfigEnvironment(std::string const& dataDir, std::string const& configPath) : broadcaster(ConfigFollowerInterface{}), cbfi(makeReference>()), - readFrom(configPath, {}) {} + readFrom(dataDir, configPath, {}) {} Future setup() { return setup(this); } @@ -319,6 +324,8 @@ class TransactionEnvironment { } public: + TransactionEnvironment(std::string const& dataDir) : writeTo(dataDir) {} + Future setup() { return Void(); } void restartNode() { writeTo.restartNode(); } @@ -355,8 +362,8 @@ class TransactionToLocalConfigEnvironment { } public: - TransactionToLocalConfigEnvironment(std::string const& configPath) - : readFrom(configPath, {}), broadcaster(writeTo.getFollowerInterface()), + TransactionToLocalConfigEnvironment(std::string const& dataDir, std::string const& configPath) + : writeTo(dataDir), readFrom(dataDir, configPath, {}), broadcaster(writeTo.getFollowerInterface()), cbfi(makeReference>()) {} Future setup() { return setup(this); } @@ -417,9 +424,13 @@ Future compact(BroadcasterToLocalConfigEnvironment& env) { return Void(); } +std::string getDataDir(UnitTestParameters const& params) { + return params.get("unitTestDataDir").get(); +} + ACTOR template -Future testRestartLocalConfig() { - state Env env("class-A"); +Future testRestartLocalConfig(UnitTestParameters params) { + state Env env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(check(env, 1)); @@ -431,8 +442,8 @@ Future testRestartLocalConfig() { } ACTOR template -Future testRestartLocalConfigAndChangeClass() { - state Env env("class-A"); +Future testRestartLocalConfigAndChangeClass(UnitTestParameters params) { + state Env env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(check(env, 1)); @@ -444,8 +455,8 @@ Future testRestartLocalConfigAndChangeClass() { } ACTOR template -Future testSet() { - state LocalConfigEnvironment env("class-A", {}); +Future testSet(UnitTestParameters params) { + state LocalConfigEnvironment env(getDataDir(params), "class-A", {}); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(check(env, 1)); @@ -453,8 +464,8 @@ Future testSet() { } ACTOR template -Future testClear() { - state LocalConfigEnvironment env("class-A", {}); +Future testClear(UnitTestParameters params) { + state LocalConfigEnvironment env(getDataDir(params), "class-A", {}); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(clear(env, "class-A"_sr)); @@ -463,8 +474,8 @@ Future testClear() { } ACTOR template -Future testGlobalSet() { - state Env env("class-A"); +Future testGlobalSet(UnitTestParameters params) { + state Env env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, Optional{}, 1)); env.check(1); @@ -474,8 +485,8 @@ Future testGlobalSet() { } ACTOR template -Future testIgnore() { - state Env env("class-A"); +Future testIgnore(UnitTestParameters params) { + state Env env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, "class-B"_sr, 1)); choose { @@ -486,8 +497,8 @@ Future testIgnore() { } ACTOR template -Future testCompact() { - state Env env("class-A"); +Future testCompact(UnitTestParameters params) { + state Env env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(compact(env)); @@ -498,8 +509,8 @@ Future testCompact() { } ACTOR template -Future testChangeBroadcaster() { - state Env env("class-A"); +Future testChangeBroadcaster(UnitTestParameters params) { + state Env env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(check(env, 1)); @@ -517,8 +528,8 @@ bool matches(Standalone> const& vec, std::set const& comp return (s == compareTo); } -ACTOR Future testGetConfigClasses(bool doCompact) { - state TransactionEnvironment env; +ACTOR Future testGetConfigClasses(UnitTestParameters params, bool doCompact) { + state TransactionEnvironment env(getDataDir(params)); wait(set(env, "class-A"_sr, 1)); wait(set(env, "class-B"_sr, 1)); if (doCompact) { @@ -529,8 +540,8 @@ ACTOR Future testGetConfigClasses(bool doCompact) { return Void(); } -ACTOR Future testGetKnobs(bool global, bool doCompact) { - state TransactionEnvironment env; +ACTOR Future testGetKnobs(UnitTestParameters params, bool global, bool doCompact) { + state TransactionEnvironment env(getDataDir(params)); state Optional configClass; if (!global) { configClass = "class-A"_sr; @@ -549,32 +560,32 @@ ACTOR Future testGetKnobs(bool global, bool doCompact) { } // namespace TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/Set") { - wait(testSet()); + wait(testSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/Restart") { - wait(testRestartLocalConfig()); + wait(testRestartLocalConfig(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/RestartFresh") { - wait(testRestartLocalConfigAndChangeClass()); + wait(testRestartLocalConfigAndChangeClass(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/Clear") { - wait(testClear()); + wait(testClear(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/GlobalSet") { - wait(testGlobalSet()); + wait(testGlobalSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/ConflictingOverrides") { - state LocalConfigEnvironment env("class-A/class-B", {}); + state LocalConfigEnvironment env(getDataDir(params), "class-A/class-B", {}); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); wait(set(env, "class-B"_sr, 10)); @@ -583,7 +594,7 @@ TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/ConflictingOverrides") { } TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/Manual") { - state LocalConfigEnvironment env("class-A", { { "test_long", "1000" } }); + state LocalConfigEnvironment env(getDataDir(params), "class-A", { { "test_long", "1000" } }); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); env.check(1000); @@ -591,62 +602,62 @@ TEST_CASE("/fdbserver/ConfigDB/LocalConfiguration/Manual") { } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/Set") { - wait(testSet()); + wait(testSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/Clear") { - wait(testClear()); + wait(testClear(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/Ignore") { - wait(testIgnore()); + wait(testIgnore(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/GlobalSet") { - wait(testGlobalSet()); + wait(testGlobalSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/ChangeBroadcaster") { - wait(testChangeBroadcaster()); + wait(testChangeBroadcaster(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/RestartLocalConfig") { - wait(testRestartLocalConfig()); + wait(testRestartLocalConfig(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/RestartLocalConfigAndChangeClass") { - wait(testRestartLocalConfigAndChangeClass()); + wait(testRestartLocalConfigAndChangeClass(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/BroadcasterToLocalConfig/Compact") { - wait(testCompact()); + wait(testCompact(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/Set") { - wait(testSet()); + wait(testSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/Clear") { - wait(testClear()); + wait(testClear(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/GlobalSet") { - wait(testGlobalSet()); + wait(testGlobalSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/RestartNode") { - state TransactionToLocalConfigEnvironment env("class-A"); + state TransactionToLocalConfigEnvironment env(getDataDir(params), "class-A"); wait(env.setup()); wait(set(env, "class-A"_sr, 1)); env.restartNode(); @@ -655,32 +666,32 @@ TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/RestartNode") { } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/ChangeBroadcaster") { - wait(testChangeBroadcaster()); + wait(testChangeBroadcaster(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/RestartLocalConfigAndChangeClass") { - wait(testRestartLocalConfigAndChangeClass()); + wait(testRestartLocalConfigAndChangeClass(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/TransactionToLocalConfig/CompactNode") { - wait(testCompact()); + wait(testCompact(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/Set") { - wait(testSet()); + wait(testSet(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/Clear") { - wait(testClear()); + wait(testClear(params)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/Restart") { - state TransactionEnvironment env; + state TransactionEnvironment env(getDataDir(params)); wait(set(env, "class-A"_sr, 1)); env.restartNode(); wait(check(env, "class-A"_sr, 1)); @@ -688,7 +699,7 @@ TEST_CASE("/fdbserver/ConfigDB/Transaction/Restart") { } TEST_CASE("/fdbserver/ConfigDB/Transaction/CompactNode") { - state TransactionEnvironment env; + state TransactionEnvironment env(getDataDir(params)); wait(set(env, "class-A"_sr, 1)); wait(env.compact()); wait(env.check("class-A"_sr, 1)); @@ -698,37 +709,37 @@ TEST_CASE("/fdbserver/ConfigDB/Transaction/CompactNode") { } TEST_CASE("/fdbserver/ConfigDB/Transaction/GetConfigClasses") { - wait(testGetConfigClasses(false)); + wait(testGetConfigClasses(params, false)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/CompactThenGetConfigClasses") { - wait(testGetConfigClasses(true)); + wait(testGetConfigClasses(params, true)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/GetKnobs") { - wait(testGetKnobs(false, false)); + wait(testGetKnobs(params, false, false)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/CompactThenGetKnobs") { - wait(testGetKnobs(false, true)); + wait(testGetKnobs(params, false, true)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/GetGlobalKnobs") { - wait(testGetKnobs(true, false)); + wait(testGetKnobs(params, true, false)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/CompactThenGetGlobalKnobs") { - wait(testGetKnobs(true, true)); + wait(testGetKnobs(params, true, true)); return Void(); } TEST_CASE("/fdbserver/ConfigDB/Transaction/BadRangeRead") { - state TransactionEnvironment env; + state TransactionEnvironment env(getDataDir(params)); try { wait(env.badRangeRead() || env.getError()); ASSERT(false); diff --git a/fdbserver/Coordination.actor.cpp b/fdbserver/Coordination.actor.cpp index 3672ae095d..3460f3a9cf 100644 --- a/fdbserver/Coordination.actor.cpp +++ b/fdbserver/Coordination.actor.cpp @@ -135,9 +135,8 @@ ACTOR Future localGenerationReg(GenerationRegInterface interf, OnDemandSto TEST_CASE("/fdbserver/Coordination/localGenerationReg/simple") { state GenerationRegInterface reg; - state OnDemandStore store("simfdb/unittests/", //< FIXME - deterministicRandom()->randomUniqueID(), - "coordination"); + state OnDemandStore store( + params.get("unitTestDataDir").get(), deterministicRandom()->randomUniqueID(), "coordination"); state Future actor = localGenerationReg(reg, &store); state Key the_key(deterministicRandom()->randomAlphaNumeric(deterministicRandom()->randomInt(0, 10))); diff --git a/fdbserver/SimpleConfigDatabaseNode.actor.cpp b/fdbserver/SimpleConfigDatabaseNode.actor.cpp index d6cc2e4ae1..6c39ad28d2 100644 --- a/fdbserver/SimpleConfigDatabaseNode.actor.cpp +++ b/fdbserver/SimpleConfigDatabaseNode.actor.cpp @@ -95,7 +95,6 @@ TEST_CASE("/fdbserver/ConfigDB/SimpleConfigDatabaseNode/Internal/versionedMutati class SimpleConfigDatabaseNodeImpl { UID id; - // TODO: Listen for errors OnDemandStore kvStore; std::map config; diff --git a/fdbserver/workloads/UnitTests.actor.cpp b/fdbserver/workloads/UnitTests.actor.cpp index db816fe4c7..0561cf0908 100644 --- a/fdbserver/workloads/UnitTests.actor.cpp +++ b/fdbserver/workloads/UnitTests.actor.cpp @@ -35,6 +35,7 @@ struct UnitTestWorkload : TestWorkload { std::string testPattern; int testRunLimit; UnitTestParameters testParams; + std::string dataDir; PerfIntCounter testsAvailable, testsExecuted, testsFailed; PerfDoubleCounter totalWallTime, totalSimTime; @@ -46,6 +47,8 @@ struct UnitTestWorkload : TestWorkload { enabled = !clientId; // only do this on the "first" client testPattern = getOption(options, LiteralStringRef("testsMatching"), Value()).toString(); testRunLimit = getOption(options, LiteralStringRef("maxTestCases"), -1); + dataDir = getOption(options, LiteralStringRef("unitTestDataDir"), "simfdb/unittests/"_sr).toString(); + testParams.set("unitTestDataDir", dataDir); // Consume all remaining options as testParams which the unit test can access for (auto& kv : options) { @@ -103,11 +106,13 @@ struct UnitTestWorkload : TestWorkload { state double start_timer = timer(); try { + platform::createDirectory(self->dataDir); wait(test->func(self->testParams)); } catch (Error& e) { ++self->testsFailed; result = e; } + platform::eraseDirectoryRecursive(self->dataDir); ++self->testsExecuted; double wallTime = timer() - start_timer; double simTime = now() - start_now; diff --git a/flow/UnitTest.h b/flow/UnitTest.h index 3a0d4c1db6..a82544d354 100644 --- a/flow/UnitTest.h +++ b/flow/UnitTest.h @@ -118,4 +118,4 @@ extern UnitTestCollection g_unittests; #endif -#endif \ No newline at end of file +#endif