aboutsummaryrefslogtreecommitdiffstats
path: root/vdstestlib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2016-11-14 14:51:44 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2016-11-14 14:51:44 +0000
commit341cc8cd727620353572df905f248ce1d69613ea (patch)
tree80cddf15f524795028736f982bb1e79981feb5e8 /vdstestlib
parentd316bb2d8c1933e4d61915d3b879628bd5d07143 (diff)
Make DirConfig thread and process safe.
Diffstat (limited to 'vdstestlib')
-rw-r--r--vdstestlib/src/tests/dirconfig/dirconfigtest.cpp18
-rw-r--r--vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp41
-rw-r--r--vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h1
3 files changed, 43 insertions, 17 deletions
diff --git a/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp b/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp
index d373b7de7e4..5e6051269ea 100644
--- a/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp
+++ b/vdstestlib/src/tests/dirconfig/dirconfigtest.cpp
@@ -34,6 +34,7 @@ Test::Main()
#define ASSERT_FILE_CONTENT(file, content) \
{ \
std::ifstream in(file); \
+ EXPECT_TRUE(bool(in)); \
std::ostringstream ost; \
std::string line; \
while (getline(in, line, '\n')) { \
@@ -45,9 +46,14 @@ Test::Main()
void Test::testNormalUsage() {
DirConfig config1;
DirConfig config2;
-
- EXPECT_EQUAL("dir:dirconfig.tmp/1", config1.getConfigId());
- EXPECT_EQUAL("dir:dirconfig.tmp/2", config2.getConfigId());
+ EXPECT_EQUAL(strncmp("dir:dirconfig.tmp.", config1.getConfigId().c_str(), 18), 0);
+ EXPECT_EQUAL(26u, config1.getConfigId().size());
+ EXPECT_EQUAL('/', config1.getConfigId()[24]);
+ EXPECT_EQUAL('0', config1.getConfigId()[25]);
+ EXPECT_EQUAL(strncmp("dir:dirconfig.tmp.", config2.getConfigId().c_str(), 18), 0);
+ EXPECT_EQUAL(26u, config2.getConfigId().size());
+ EXPECT_EQUAL('/', config2.getConfigId()[24]);
+ EXPECT_EQUAL('1', config2.getConfigId()[25]);
try{
config1.getConfig("testconfig");
@@ -72,7 +78,7 @@ void Test::testNormalUsage() {
// Trigger publish
config1.getConfigId();
- ASSERT_FILE_CONTENT("dirconfig.tmp/1/testconfig.cfg",
+ ASSERT_FILE_CONTENT(config1.getDir() + "/testconfig.cfg",
"intval 7\n"
"stringval \"foo\"\n");
@@ -90,9 +96,9 @@ void Test::testNormalUsage() {
config1.publish();
config2.publish();
- ASSERT_FILE_CONTENT("dirconfig.tmp/2/testconfig.cfg",
+ ASSERT_FILE_CONTENT(config2.getDir() + "/testconfig.cfg",
"intval 4\n");
- ASSERT_FILE_CONTENT("dirconfig.tmp/1/config2.cfg",
+ ASSERT_FILE_CONTENT(config1.getDir() + "/config2.cfg",
"intval 3\n"
"myarray[2]\n"
"myarray[0].foo 4\n"
diff --git a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp
index f0a56c4fd0c..a5e6d844d9b 100644
--- a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp
+++ b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.cpp
@@ -6,6 +6,7 @@
#include <fstream>
#include <vespa/log/log.h>
#include <sstream>
+#include <atomic>
#include <vespa/vespalib/io/fileutil.h>
#include <vespa/vespalib/util/exceptions.h>
@@ -16,17 +17,38 @@ namespace vdstestlib {
// When we start up first time, remove old config from the directories
// we're using
namespace {
- std::string configRoot = "dirconfig.tmp";
- int getFirstDirNumber() {
- if (system(("rm -rf " + configRoot).c_str()) != 0) {
- throw vespalib::Exception("system(rm -rf "+configRoot+" failed");
+class Root {
+public:
+ Root() :
+ _nextDir(0)
+ {
+ memset(_dirname, 0, sizeof(_dirname));
+ sprintf(_dirname, "dirconfig.tmp.XXXXXX");
+ char * realName = mkdtemp(_dirname);
+ assert(realName == _dirname);
+ }
+ ~Root() {
+ if (system((std::string("rm -rf ") + _dirname).c_str()) != 0) {
+ abort();
}
- return 0;
}
-}
-unsigned int DirConfig::_nextDir(getFirstDirNumber());
+ std::string nextDir() {
+ char name[64];
+ uint32_t id = _nextDir++;
+ sprintf(name, "%s/%u", _dirname, id);
+ return name;
+ }
+private:
+ std::string dir() const { return _dirname; }
+ char _dirname[64];
+ std::atomic<uint32_t> _nextDir;
+};
+
+Root _G_root;
+
+}
DirConfig::Config::Config(const ConfigName& name)
: defFileName(name),
@@ -87,11 +109,8 @@ DirConfig::Config::get(const ConfigKey& key) const
DirConfig::DirConfig()
: _configs(),
- _dirName()
+ _dirName(_G_root.nextDir())
{
- std::ostringstream ost;
- ost << configRoot << '/' << ++_nextDir;
- _dirName = ost.str();
vespalib::mkdir(_dirName, true);
}
diff --git a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h
index 0513628a74e..116f2f76e93 100644
--- a/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h
+++ b/vdstestlib/src/vespa/vdstestlib/cppunit/dirconfig.h
@@ -71,6 +71,7 @@ struct DirConfig {
/** Get the id that should be used to get config from this instance. */
std::string getConfigId() const;
+ std::string getDir() const { return _dirName; }
/** Return whether memory representation currently differ from files. */
bool isCacheDirty() const;