diff options
author | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@yahoo-inc.com> | 2016-06-15 23:09:44 +0200 |
commit | 72231250ed81e10d66bfe70701e64fa5fe50f712 (patch) | |
tree | 2728bba1131a6f6e5bdf95afec7d7ff9358dac50 /config/src/tests/file_subscription |
Publish
Diffstat (limited to 'config/src/tests/file_subscription')
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 |