config_data_unittests.cc 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. // Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
  2. //
  3. // Permission to use, copy, modify, and/or distribute this software for any
  4. // purpose with or without fee is hereby granted, provided that the above
  5. // copyright notice and this permission notice appear in all copies.
  6. //
  7. // THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
  8. // REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  9. // AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
  10. // INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  11. // LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
  12. // OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  13. // PERFORMANCE OF THIS SOFTWARE.
  14. #include <gtest/gtest.h>
  15. #include <config/tests/data_def_unittests_config.h>
  16. #include <config/config_data.h>
  17. #include <iostream>
  18. using namespace isc::data;
  19. using namespace isc::config;
  20. ConfigData
  21. setupSpec2() {
  22. ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec22.spec");
  23. return (ConfigData(spec2));
  24. }
  25. TEST(ConfigData, Creation) {
  26. ConfigData cd = setupSpec2();
  27. EXPECT_TRUE(true);
  28. }
  29. TEST(ConfigData, getValue) {
  30. ModuleSpec spec22 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec22.spec");
  31. ConfigData cd = ConfigData(spec22);
  32. //std::cout << "[XX] SPEC2: " << cd.getModuleSpec().getFullSpec() << std::endl;
  33. bool is_default;
  34. //ElementPtr value = cd.getValue(is_default, "item1");
  35. EXPECT_EQ(9, cd.getValue("value1")->intValue());
  36. EXPECT_EQ(9, cd.getValue(is_default, "value1")->intValue());
  37. EXPECT_TRUE(is_default);
  38. EXPECT_EQ(9.9, cd.getValue("value2")->doubleValue());
  39. EXPECT_EQ(9.9, cd.getValue(is_default, "value2")->doubleValue());
  40. EXPECT_TRUE(is_default);
  41. EXPECT_FALSE(cd.getValue("value3")->boolValue());
  42. EXPECT_FALSE(cd.getValue(is_default, "value3")->boolValue());
  43. EXPECT_TRUE(is_default);
  44. EXPECT_EQ("default_string", cd.getValue("value4")->stringValue());
  45. EXPECT_EQ("default_string", cd.getValue(is_default, "value4")->stringValue());
  46. EXPECT_TRUE(is_default);
  47. EXPECT_EQ("a", cd.getValue("value5")->get(0)->stringValue());
  48. EXPECT_EQ("a", cd.getValue(is_default, "value5")->get(0)->stringValue());
  49. EXPECT_TRUE(is_default);
  50. EXPECT_EQ("b", cd.getValue("value5")->get(1)->stringValue());
  51. EXPECT_EQ("b", cd.getValue(is_default, "value5")->get(1)->stringValue());
  52. EXPECT_EQ("b", cd.getValue(is_default, "value5/")->get(1)->stringValue());
  53. EXPECT_TRUE(is_default);
  54. EXPECT_EQ("{ }", cd.getValue("value6")->str());
  55. EXPECT_EQ("{ }", cd.getValue(is_default, "value6")->str());
  56. EXPECT_EQ("{ }", cd.getValue(is_default, "value6/")->str());
  57. EXPECT_TRUE(is_default);
  58. EXPECT_EQ("[ ]", cd.getValue("value8")->str());
  59. EXPECT_EQ("[ ]", cd.getDefaultValue("value8")->str());
  60. EXPECT_EQ("empty", cd.getValue("value8/a")->stringValue());
  61. EXPECT_THROW(cd.getValue("")->str(), DataNotFoundError);
  62. EXPECT_THROW(cd.getValue("/")->str(), DataNotFoundError);
  63. EXPECT_THROW(cd.getValue("no_such_item")->str(), DataNotFoundError);
  64. EXPECT_THROW(cd.getValue("value6/a")->str(), DataNotFoundError);
  65. EXPECT_THROW(cd.getValue("value6/no_such_item")->str(), DataNotFoundError);
  66. EXPECT_THROW(cd.getValue("value8/b")->str(), DataNotFoundError);
  67. ModuleSpec spec1 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec1.spec");
  68. ConfigData cd1 = ConfigData(spec1);
  69. EXPECT_THROW(cd1.getValue("anything")->str(), DataNotFoundError);
  70. }
  71. TEST(ConfigData, getDefaultValue) {
  72. ModuleSpec spec31 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec31.spec");
  73. ConfigData cd = ConfigData(spec31);
  74. EXPECT_EQ("[ ]", cd.getDefaultValue("first_list_items")->str());
  75. EXPECT_EQ("\"foo\"", cd.getDefaultValue("first_list_items/foo")->str());
  76. EXPECT_EQ("{ }", cd.getDefaultValue("first_list_items/second_list_items/map_element")->str());
  77. EXPECT_EQ("[ ]", cd.getDefaultValue("first_list_items/second_list_items/map_element/list1")->str());
  78. EXPECT_EQ("1", cd.getDefaultValue("first_list_items/second_list_items/map_element/list1/number")->str());
  79. EXPECT_THROW(cd.getDefaultValue("doesnotexist")->str(), DataNotFoundError);
  80. EXPECT_THROW(cd.getDefaultValue("first_list_items/second_list_items/map_element/list1/doesnotexist")->str(), DataNotFoundError);
  81. }
  82. TEST(ConfigData, setLocalConfig) {
  83. ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec2.spec");
  84. ConfigData cd = ConfigData(spec2);
  85. bool is_default;
  86. ElementPtr my_config = Element::fromJSON("{ \"item1\": 2 }");
  87. ElementPtr my_config2 = Element::fromJSON("{ \"item6\": { \"value1\": \"a\" } }");
  88. EXPECT_EQ("{ }", cd.getValue("item6")->str());
  89. cd.setLocalConfig(my_config);
  90. EXPECT_EQ(2, cd.getValue(is_default, "item1")->intValue());
  91. EXPECT_FALSE(is_default);
  92. EXPECT_EQ("{ }", cd.getValue("item6")->str());
  93. EXPECT_EQ(1.1, cd.getValue(is_default, "item2")->doubleValue());
  94. EXPECT_TRUE(is_default);
  95. cd.setLocalConfig(my_config2);
  96. EXPECT_EQ("{ \"value1\": \"a\" }", cd.getValue("item6")->str());
  97. }
  98. TEST(ConfigData, getLocalConfig) {
  99. ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec2.spec");
  100. ConfigData cd = ConfigData(spec2);
  101. EXPECT_EQ("{ }", cd.getLocalConfig()->str());
  102. ElementPtr my_config = Element::fromJSON("{ \"item1\": 2 }");
  103. cd.setLocalConfig(my_config);
  104. EXPECT_EQ("{ \"item1\": 2 }", cd.getLocalConfig()->str());
  105. ElementPtr my_config2 = Element::fromJSON("{ \"item6\": { \"value1\": \"a\" } }");
  106. cd.setLocalConfig(my_config2);
  107. EXPECT_EQ("{ \"item6\": { \"value1\": \"a\" } }", cd.getLocalConfig()->str());
  108. }
  109. TEST(ConfigData, getItemList) {
  110. ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec2.spec");
  111. ConfigData cd = ConfigData(spec2);
  112. EXPECT_EQ("[ \"item1\", \"item2\", \"item3\", \"item4\", \"item5\", \"item6\" ]", cd.getItemList()->str());
  113. EXPECT_EQ("[ \"item1\", \"item2\", \"item3\", \"item4\", \"item5\", \"item6/value1\", \"item6/value2\" ]", cd.getItemList("", true)->str());
  114. EXPECT_EQ("[ \"item6/value1\", \"item6/value2\" ]", cd.getItemList("item6")->str());
  115. }
  116. TEST(ConfigData, getFullConfig) {
  117. ModuleSpec spec2 = moduleSpecFromFile(std::string(TEST_DATA_PATH) + "/spec2.spec");
  118. ConfigData cd = ConfigData(spec2);
  119. EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6\": { } }", cd.getFullConfig()->str());
  120. ElementPtr my_config = Element::fromJSON("{ \"item1\": 2 }");
  121. cd.setLocalConfig(my_config);
  122. EXPECT_EQ("{ \"item1\": 2, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6\": { } }", cd.getFullConfig()->str());
  123. ElementPtr my_config2 = Element::fromJSON("{ \"item6\": { \"value1\": \"a\" } }");
  124. cd.setLocalConfig(my_config2);
  125. EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6\": { \"value1\": \"a\" } }", cd.getFullConfig()->str());
  126. ElementPtr my_config3 = Element::fromJSON("{ \"item6\": { \"value2\": 123 } }");
  127. cd.setLocalConfig(my_config3);
  128. EXPECT_EQ("{ \"item1\": 1, \"item2\": 1.1, \"item3\": true, \"item4\": \"test\", \"item5\": [ \"a\", \"b\" ], \"item6\": { \"value2\": 123 } }", cd.getFullConfig()->str());
  129. }