aboutsummaryrefslogtreecommitdiffstats
path: root/config/src/tests/file_subscription
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
committerJon Bratseth <bratseth@yahoo-inc.com>2016-06-15 23:09:44 +0200
commit72231250ed81e10d66bfe70701e64fa5fe50f712 (patch)
tree2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /config/src/tests/file_subscription
Publish
Diffstat (limited to 'config/src/tests/file_subscription')
-rw-r--r--config/src/tests/file_subscription/.gitignore11
-rw-r--r--config/src/tests/file_subscription/CMakeLists.txt13
-rw-r--r--config/src/tests/file_subscription/cfgdir/bar.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgdir/foo.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgdir2/bar.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgdir2/foobar.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgdir3/bar.bar.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgdir3/bar.foo.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgemptyfile/bar.cfg1
-rw-r--r--config/src/tests/file_subscription/cfgemptyfile/foodefault.cfg0
-rw-r--r--config/src/tests/file_subscription/cfgnonexistingfile/bar.cfg1
-rw-r--r--config/src/tests/file_subscription/file_subscription.cpp205
-rw-r--r--config/src/tests/file_subscription/my.cfg1
-rw-r--r--config/src/tests/file_subscription/test1.cfg0
14 files changed, 238 insertions, 0 deletions
diff --git a/config/src/tests/file_subscription/.gitignore b/config/src/tests/file_subscription/.gitignore
new file mode 100644
index 00000000000..7dd29b02329
--- /dev/null
+++ b/config/src/tests/file_subscription/.gitignore
@@ -0,0 +1,11 @@
+/config-my.cpp
+/config-my.h
+/config-bar.cpp
+/config-bar.h
+/config-foo.cpp
+/config-foo.h
+/config-foobar.cpp
+/config-foobar.h
+/config-foodefault.cpp
+/config-foodefault.h
+config_file_subscription_test_app
diff --git a/config/src/tests/file_subscription/CMakeLists.txt b/config/src/tests/file_subscription/CMakeLists.txt
new file mode 100644
index 00000000000..f582732ffb2
--- /dev/null
+++ b/config/src/tests/file_subscription/CMakeLists.txt
@@ -0,0 +1,13 @@
+# Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+vespa_add_executable(config_file_subscription_test_app
+ SOURCES
+ file_subscription.cpp
+ DEPENDS
+ config_cloudconfig
+)
+vespa_add_test(NAME config_file_subscription_test_app COMMAND config_file_subscription_test_app)
+vespa_generate_config(config_file_subscription_test_app ../../test/resources/configdefinitions/my.def)
+vespa_generate_config(config_file_subscription_test_app ../../test/resources/configdefinitions/foo.def)
+vespa_generate_config(config_file_subscription_test_app ../../test/resources/configdefinitions/bar.def)
+vespa_generate_config(config_file_subscription_test_app ../../test/resources/configdefinitions/foobar.def)
+vespa_generate_config(config_file_subscription_test_app ../../test/resources/configdefinitions/foodefault.def)
diff --git a/config/src/tests/file_subscription/cfgdir/bar.cfg b/config/src/tests/file_subscription/cfgdir/bar.cfg
new file mode 100644
index 00000000000..cd7ce3a73ec
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgdir/bar.cfg
@@ -0,0 +1 @@
+barValue "barbar"
diff --git a/config/src/tests/file_subscription/cfgdir/foo.cfg b/config/src/tests/file_subscription/cfgdir/foo.cfg
new file mode 100644
index 00000000000..288a1571758
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgdir/foo.cfg
@@ -0,0 +1 @@
+fooValue "foofoo"
diff --git a/config/src/tests/file_subscription/cfgdir2/bar.cfg b/config/src/tests/file_subscription/cfgdir2/bar.cfg
new file mode 100644
index 00000000000..cd7ce3a73ec
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgdir2/bar.cfg
@@ -0,0 +1 @@
+barValue "barbar"
diff --git a/config/src/tests/file_subscription/cfgdir2/foobar.cfg b/config/src/tests/file_subscription/cfgdir2/foobar.cfg
new file mode 100644
index 00000000000..e938175a509
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgdir2/foobar.cfg
@@ -0,0 +1 @@
+fooBarValue "foobarlol"
diff --git a/config/src/tests/file_subscription/cfgdir3/bar.bar.cfg b/config/src/tests/file_subscription/cfgdir3/bar.bar.cfg
new file mode 100644
index 00000000000..5246bbb392d
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgdir3/bar.bar.cfg
@@ -0,0 +1 @@
+barValue "foobarlol"
diff --git a/config/src/tests/file_subscription/cfgdir3/bar.foo.cfg b/config/src/tests/file_subscription/cfgdir3/bar.foo.cfg
new file mode 100644
index 00000000000..cd7ce3a73ec
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgdir3/bar.foo.cfg
@@ -0,0 +1 @@
+barValue "barbar"
diff --git a/config/src/tests/file_subscription/cfgemptyfile/bar.cfg b/config/src/tests/file_subscription/cfgemptyfile/bar.cfg
new file mode 100644
index 00000000000..cd7ce3a73ec
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgemptyfile/bar.cfg
@@ -0,0 +1 @@
+barValue "barbar"
diff --git a/config/src/tests/file_subscription/cfgemptyfile/foodefault.cfg b/config/src/tests/file_subscription/cfgemptyfile/foodefault.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgemptyfile/foodefault.cfg
diff --git a/config/src/tests/file_subscription/cfgnonexistingfile/bar.cfg b/config/src/tests/file_subscription/cfgnonexistingfile/bar.cfg
new file mode 100644
index 00000000000..cd7ce3a73ec
--- /dev/null
+++ b/config/src/tests/file_subscription/cfgnonexistingfile/bar.cfg
@@ -0,0 +1 @@
+barValue "barbar"
diff --git a/config/src/tests/file_subscription/file_subscription.cpp b/config/src/tests/file_subscription/file_subscription.cpp
new file mode 100644
index 00000000000..4b2c84281e9
--- /dev/null
+++ b/config/src/tests/file_subscription/file_subscription.cpp
@@ -0,0 +1,205 @@
+// Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+#include <vespa/fastos/fastos.h>
+#include <vespa/vespalib/testkit/test_kit.h>
+#include <vespa/config/config.h>
+#include <vespa/config/common/configholder.h>
+#include <vespa/config/file/filesource.h>
+#include <vespa/vespalib/util/sync.h>
+#include <fstream>
+#include <config-my.h>
+#include <config-foo.h>
+#include <config-foodefault.h>
+#include <config-bar.h>
+#include <config-foobar.h>
+#include <vespa/log/log.h>
+LOG_SETUP(".filesubscription_test");
+
+using namespace config;
+
+namespace {
+
+ void writeFile(const std::string & fileName, const std::string & myFieldVal)
+ {
+ std::ofstream of;
+ of.open(fileName.c_str());
+ of << "myField \"" << myFieldVal << "\"\n";
+ of.close();
+ }
+}
+
+TEST("requireThatFileSpecGivesCorrectKey") {
+ std::string str("/home/my/config.cfg");
+ FileSpec spec(str);
+ bool thrown = false;
+ try {
+ FileSpec s1("fb");
+ FileSpec s2("fb.cfh");
+ FileSpec s3("fb.dch");
+ FileSpec s4("fbcfg");
+ FileSpec s5(".cfg");
+ } catch (const InvalidConfigSourceException & e) {
+ thrown = true;
+ }
+ ASSERT_TRUE(thrown);
+
+ thrown = false;
+ try {
+ FileSpec s1("fb.cfg");
+ FileSpec s2("a.cfg");
+ FileSpec s3("fljdlfjsalf.cfg");
+ } catch (const InvalidConfigSourceException & e) {
+ thrown = true;
+ }
+ ASSERT_FALSE(thrown);
+}
+
+TEST("requireThatFileSpecGivesCorrectSource") {
+ writeFile("my.cfg", "foobar");
+ FileSpec spec("my.cfg");
+
+ SourceFactory::UP factory(spec.createSourceFactory(TimingValues()));
+ ASSERT_TRUE(factory.get() != NULL);
+ IConfigHolder::SP holder(new ConfigHolder());
+ Source::UP src = factory->createSource(holder, ConfigKey("my", "my", "bar", "foo"));
+ ASSERT_TRUE(src.get() != NULL);
+
+ src->getConfig();
+ ASSERT_TRUE(holder->poll());
+ ConfigUpdate::UP update(holder->provide());
+ ASSERT_TRUE(update.get() != NULL);
+ const ConfigValue & value(update->getValue());
+ ASSERT_EQUAL(1u, value.numLines());
+ ASSERT_EQUAL("myField \"foobar\"", value.getLine(0));
+}
+
+TEST("requireThatFileSubscriptionReturnsCorrectConfig") {
+ writeFile("my.cfg", "foobar");
+ ConfigSubscriber s(FileSpec("my.cfg"));
+ std::unique_ptr<ConfigHandle<MyConfig> > handle = s.subscribe<MyConfig>("my");
+ s.nextConfig(0);
+ std::unique_ptr<MyConfig> cfg = handle->getConfig();
+ ASSERT_TRUE(cfg.get() != NULL);
+ ASSERT_EQUAL("foobar", cfg->myField);
+ ASSERT_EQUAL("my", cfg->defName());
+ ASSERT_FALSE(s.nextConfig(100));
+}
+
+TEST("requireThatReconfigIsCalledWhenConfigChanges") {
+ writeFile("my.cfg", "foo");
+ {
+ IConfigContext::SP context(new ConfigContext(FileSpec("my.cfg")));
+ ConfigSubscriber s(context);
+ std::unique_ptr<ConfigHandle<MyConfig> > handle = s.subscribe<MyConfig>("");
+ s.nextConfig(0);
+ std::unique_ptr<MyConfig> cfg = handle->getConfig();
+ ASSERT_TRUE(cfg.get() != NULL);
+ ASSERT_EQUAL("foo", cfg->myField);
+ ASSERT_EQUAL("my", cfg->defName());
+ ASSERT_FALSE(s.nextConfig(3000));
+ writeFile("my.cfg", "bar");
+ context->reload();
+ bool correctValue = false;
+ FastOS_Time timer;
+ timer.SetNow();
+ while (!correctValue && timer.MilliSecsToNow() < 20000.0) {
+ LOG(info, "Testing value...");
+ if (s.nextConfig(1000)) {
+ break;
+ }
+ }
+ cfg = handle->getConfig();
+ ASSERT_TRUE(cfg.get() != NULL);
+ ASSERT_EQUAL("bar", cfg->myField);
+ ASSERT_EQUAL("my", cfg->defName());
+ ASSERT_FALSE(s.nextConfig(1000));
+ }
+}
+
+TEST("requireThatMultipleSubscribersCanSubscribeToSameFile") {
+ writeFile("my.cfg", "foobar");
+ FileSpec spec("my.cfg");
+ {
+ ConfigSubscriber s1(spec);
+ std::unique_ptr<ConfigHandle<MyConfig> > h1 = s1.subscribe<MyConfig>("");
+ ASSERT_TRUE(s1.nextConfig(0));
+ ConfigSubscriber s2(spec);
+ std::unique_ptr<ConfigHandle<MyConfig> > h2 = s2.subscribe<MyConfig>("");
+ ASSERT_TRUE(s2.nextConfig(0));
+ }
+}
+
+TEST("requireThatCanSubscribeToDirectory") {
+ DirSpec spec("cfgdir");
+ ConfigSubscriber s(spec);
+ ConfigHandle<FooConfig>::UP fooHandle = s.subscribe<FooConfig>("");
+ ConfigHandle<BarConfig>::UP barHandle = s.subscribe<BarConfig>("");
+ ASSERT_TRUE(s.nextConfig(0));
+ ASSERT_TRUE(fooHandle->isChanged());
+ ASSERT_TRUE(barHandle->isChanged());
+ std::unique_ptr<FooConfig> fooCfg = fooHandle->getConfig();
+ std::unique_ptr<BarConfig> barCfg = barHandle->getConfig();
+ ASSERT_TRUE(fooCfg.get() != NULL);
+ ASSERT_TRUE(barCfg.get() != NULL);
+ ASSERT_EQUAL("foofoo", fooCfg->fooValue);
+ ASSERT_EQUAL("barbar", barCfg->barValue);
+}
+
+TEST("requireThatCanSubscribeToDirectoryWithEmptyCfgFile") {
+ DirSpec spec("cfgemptyfile");
+ ConfigSubscriber s(spec);
+ ConfigHandle<FoodefaultConfig>::UP fooHandle = s.subscribe<FoodefaultConfig>("");
+ ConfigHandle<BarConfig>::UP barHandle = s.subscribe<BarConfig>("");
+ ASSERT_TRUE(s.nextConfig(0));
+ ASSERT_TRUE(fooHandle->isChanged());
+ ASSERT_TRUE(barHandle->isChanged());
+ std::unique_ptr<FoodefaultConfig> fooCfg = fooHandle->getConfig();
+ std::unique_ptr<BarConfig> barCfg = barHandle->getConfig();
+ ASSERT_TRUE(fooCfg.get() != NULL);
+ ASSERT_TRUE(barCfg.get() != NULL);
+ ASSERT_EQUAL("per", fooCfg->fooValue);
+ ASSERT_EQUAL("barbar", barCfg->barValue);
+}
+
+TEST("requireThatCanSubscribeToDirectoryWithNonExistingCfgFile") {
+ DirSpec spec("cfgnonexistingfile");
+ ConfigSubscriber s(spec);
+ ConfigHandle<FoodefaultConfig>::UP fooHandle = s.subscribe<FoodefaultConfig>("");
+ ConfigHandle<BarConfig>::UP barHandle = s.subscribe<BarConfig>("");
+ ASSERT_TRUE(s.nextConfig(0));
+ ASSERT_TRUE(fooHandle->isChanged());
+ ASSERT_TRUE(barHandle->isChanged());
+ std::unique_ptr<FoodefaultConfig> fooCfg = fooHandle->getConfig();
+ std::unique_ptr<BarConfig> barCfg = barHandle->getConfig();
+ ASSERT_TRUE(fooCfg.get() != NULL);
+ ASSERT_TRUE(barCfg.get() != NULL);
+ ASSERT_EQUAL("per", fooCfg->fooValue);
+ ASSERT_EQUAL("barbar", barCfg->barValue);
+}
+
+TEST_F("requireThatDirSpecDoesNotMixNames", DirSpec("cfgdir2")) {
+ ConfigSubscriber s(f);
+ ConfigHandle<BarConfig>::UP barHandle = s.subscribe<BarConfig>("");
+ ConfigHandle<FoobarConfig>::UP foobarHandle = s.subscribe<FoobarConfig>("");
+ s.nextConfig(0);
+ std::unique_ptr<BarConfig> bar = barHandle->getConfig();
+ std::unique_ptr<FoobarConfig> foobar = foobarHandle->getConfig();
+ ASSERT_TRUE(bar.get() != NULL);
+ ASSERT_TRUE(foobar.get() != NULL);
+ ASSERT_EQUAL("barbar", bar->barValue);
+ ASSERT_EQUAL("foobarlol", foobar->fooBarValue);
+}
+
+TEST_F("require that can subscribe multiple config ids of same config", DirSpec("cfgdir3")) {
+ ConfigSubscriber s(f1);
+ ConfigHandle<BarConfig>::UP fooHandle = s.subscribe<BarConfig>("foo");
+ ConfigHandle<BarConfig>::UP barHandle = s.subscribe<BarConfig>("bar");
+ s.nextConfig(0);
+ std::unique_ptr<BarConfig> bar1 = fooHandle->getConfig();
+ std::unique_ptr<BarConfig> bar2 = barHandle->getConfig();
+ ASSERT_TRUE(bar1.get() != NULL);
+ ASSERT_TRUE(bar2.get() != NULL);
+ ASSERT_EQUAL("barbar", bar1->barValue);
+ ASSERT_EQUAL("foobarlol", bar2->barValue);
+}
+
+TEST_MAIN() { TEST_RUN_ALL(); }
diff --git a/config/src/tests/file_subscription/my.cfg b/config/src/tests/file_subscription/my.cfg
new file mode 100644
index 00000000000..6172609bdff
--- /dev/null
+++ b/config/src/tests/file_subscription/my.cfg
@@ -0,0 +1 @@
+myField "foobar"
diff --git a/config/src/tests/file_subscription/test1.cfg b/config/src/tests/file_subscription/test1.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/config/src/tests/file_subscription/test1.cfg