PageRenderTime 41ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/mordor/tests/config.cpp

http://github.com/mozy/mordor
C++ | 272 lines | 236 code | 28 blank | 8 comment | 12 complexity | 026500cf3eee1fb69f527b123913b802 MD5 | raw file
Possible License(s): BSD-3-Clause
  1. // Copyright (c) 2011 - Mozy, Inc.
  2. #include "mordor/config.h"
  3. #include "mordor/test/test.h"
  4. #ifdef HAVE_CONFIG_H
  5. #include "autoconfig.h"
  6. #endif
  7. #ifdef HAVE_LIBYAML
  8. #include "mordor/yaml.h"
  9. #endif
  10. using namespace Mordor;
  11. using namespace Mordor::Test;
  12. static ConfigVar<int>::ptr g_testVar1 = Config::lookup(
  13. "config.test", 0, "Config var used by unit test");
  14. MORDOR_UNITTEST(Config, loadFromCommandLineNull)
  15. {
  16. int argc = 0;
  17. char **argv = NULL;
  18. Config::loadFromCommandLine(argc, argv);
  19. MORDOR_TEST_ASSERT_EQUAL(argc, 0);
  20. MORDOR_TEST_ASSERT(argv == NULL);
  21. }
  22. MORDOR_UNITTEST(Config, loadFromCommandLineEmpty)
  23. {
  24. int argc = 1;
  25. std::string args[] = { "--config.test=1" };
  26. char *argv[1];
  27. for (int i = 0; i < argc; ++i)
  28. argv[i] = const_cast<char *>(args[i].c_str());
  29. g_testVar1->val(0);
  30. Config::loadFromCommandLine(argc, argv);
  31. // Didn't do anything, even though it looks like a config argument
  32. MORDOR_TEST_ASSERT_EQUAL(argc, 1);
  33. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "--config.test=1");
  34. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 0);
  35. }
  36. MORDOR_UNITTEST(Config, loadFromCommandLineSimpleEquals)
  37. {
  38. int argc = 2;
  39. std::string args[] = { "program",
  40. "--config.test=1" };
  41. char *argv[2];
  42. for (int i = 0; i < argc; ++i)
  43. argv[i] = const_cast<char *>(args[i].c_str());
  44. g_testVar1->val(0);
  45. Config::loadFromCommandLine(argc, argv);
  46. MORDOR_TEST_ASSERT_EQUAL(argc, 1);
  47. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  48. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 1);
  49. }
  50. MORDOR_UNITTEST(Config, loadFromCommandLineSimple)
  51. {
  52. int argc = 3;
  53. std::string args[] = { "program",
  54. "--config.test",
  55. "1" };
  56. char *argv[3];
  57. for (int i = 0; i < argc; ++i)
  58. argv[i] = const_cast<char *>(args[i].c_str());
  59. g_testVar1->val(0);
  60. Config::loadFromCommandLine(argc, argv);
  61. MORDOR_TEST_ASSERT_EQUAL(argc, 1);
  62. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  63. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 1);
  64. }
  65. MORDOR_UNITTEST(Config, loadFromCommandLineNoConfigVars)
  66. {
  67. int argc = 3;
  68. std::string args[] = { "program",
  69. "--notaconfigvar",
  70. "norami" };
  71. char *argv[3];
  72. for (int i = 0; i < argc; ++i)
  73. argv[i] = const_cast<char *>(args[i].c_str());
  74. Config::loadFromCommandLine(argc, argv);
  75. MORDOR_TEST_ASSERT_EQUAL(argc, 3);
  76. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  77. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[1], "--notaconfigvar");
  78. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[2], "norami");
  79. }
  80. MORDOR_UNITTEST(Config, loadFromCommandLineStripConfigVars)
  81. {
  82. int argc = 4;
  83. std::string args[] = { "program",
  84. "--notaconfigvar",
  85. "--config.test=1",
  86. "norami" };
  87. char *argv[4];
  88. for (int i = 0; i < argc; ++i)
  89. argv[i] = const_cast<char *>(args[i].c_str());
  90. g_testVar1->val(0);
  91. Config::loadFromCommandLine(argc, argv);
  92. MORDOR_TEST_ASSERT_EQUAL(argc, 3);
  93. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  94. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[1], "--notaconfigvar");
  95. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[2], "norami");
  96. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 1);
  97. }
  98. MORDOR_UNITTEST(Config, loadFromCommandLineStripConfigVars2)
  99. {
  100. int argc = 5;
  101. std::string args[] = { "program",
  102. "--notaconfigvar",
  103. "--config.test",
  104. "1",
  105. "norami" };
  106. char *argv[5];
  107. for (int i = 0; i < argc; ++i)
  108. argv[i] = const_cast<char *>(args[i].c_str());
  109. g_testVar1->val(0);
  110. Config::loadFromCommandLine(argc, argv);
  111. MORDOR_TEST_ASSERT_EQUAL(argc, 3);
  112. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  113. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[1], "--notaconfigvar");
  114. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[2], "norami");
  115. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 1);
  116. }
  117. MORDOR_UNITTEST(Config, loadFromCommandLineMissingArg)
  118. {
  119. int argc = 2;
  120. std::string args[] = { "program",
  121. "--config.test" };
  122. char *argv[2];
  123. for (int i = 0; i < argc; ++i)
  124. argv[i] = const_cast<char *>(args[i].c_str());
  125. MORDOR_TEST_ASSERT_EXCEPTION(Config::loadFromCommandLine(argc, argv),
  126. std::invalid_argument);
  127. }
  128. MORDOR_UNITTEST(Config, loadFromCommandLineBadArg)
  129. {
  130. int argc = 2;
  131. std::string args[] = { "program",
  132. "--config.test=bad" };
  133. char *argv[2];
  134. for (int i = 0; i < argc; ++i)
  135. argv[i] = const_cast<char *>(args[i].c_str());
  136. MORDOR_TEST_ASSERT_EXCEPTION(Config::loadFromCommandLine(argc, argv),
  137. std::invalid_argument);
  138. }
  139. MORDOR_UNITTEST(Config, loadFromCommandLineDuplicates)
  140. {
  141. int argc = 4;
  142. std::string args[] = { "program",
  143. "--config.test=1",
  144. "--config.test=2",
  145. "--config.test=3" };
  146. char *argv[4];
  147. for (int i = 0; i < argc; ++i)
  148. argv[i] = const_cast<char *>(args[i].c_str());
  149. g_testVar1->val(0);
  150. Config::loadFromCommandLine(argc, argv);
  151. MORDOR_TEST_ASSERT_EQUAL(argc, 1);
  152. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  153. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 3);
  154. }
  155. MORDOR_UNITTEST(Config, loadFromCommandLineNoConfigVarsAfterDashDash)
  156. {
  157. int argc = 4;
  158. std::string args[] = { "program",
  159. "--config.test=1",
  160. "--",
  161. "--config.test=2" };
  162. char *argv[4];
  163. for (int i = 0; i < argc; ++i)
  164. argv[i] = const_cast<char *>(args[i].c_str());
  165. g_testVar1->val(0);
  166. Config::loadFromCommandLine(argc, argv);
  167. MORDOR_TEST_ASSERT_EQUAL(argc, 3);
  168. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[0], "program");
  169. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[1], "--");
  170. MORDOR_TEST_ASSERT_EQUAL((const char *)argv[2], "--config.test=2");
  171. MORDOR_TEST_ASSERT_EQUAL(g_testVar1->val(), 1);
  172. }
  173. MORDOR_UNITTEST(Config, configVarNameRules)
  174. {
  175. // valid name
  176. MORDOR_TEST_ASSERT(Config::lookup("validname1.test", 0));
  177. MORDOR_TEST_ASSERT(Config::lookup("a1.2x", 0));
  178. // This is a little corner case that still valid
  179. // Currently I don't think we are trying to use this specific case,
  180. // but it could be still useful, for example, some env var can be
  181. // named as A_2.
  182. MORDOR_TEST_ASSERT(Config::lookup("a.2", 0));
  183. MORDOR_TEST_ASSERT_EXCEPTION(Config::lookup("1a", 0), std::invalid_argument);
  184. MORDOR_TEST_ASSERT_EXCEPTION(Config::lookup("Aa", 0), std::invalid_argument);
  185. MORDOR_TEST_ASSERT_EXCEPTION(Config::lookup("a_", 0), std::invalid_argument);
  186. MORDOR_TEST_ASSERT_EXCEPTION(Config::lookup("a.", 0), std::invalid_argument);
  187. MORDOR_TEST_ASSERT_EXCEPTION(Config::lookup("a_b", 0), std::invalid_argument);
  188. }
  189. #ifdef HAVE_LIBYAML
  190. MORDOR_UNITTEST(Config, loadFromJSON)
  191. {
  192. ConfigVar<int>::ptr port = Config::lookup("http.port", 8080, "");
  193. ConfigVar<int>::ptr quantity = Config::lookup("quantity", 123456, "");
  194. std::ostringstream ss;
  195. ss << "http:\n"
  196. << " host: 192.168.0.1\n"
  197. << " port: 80\n"
  198. << "quantity: 654321\n"
  199. << "price: 800.34";
  200. Config::loadFromJSON(YAML::parse(ss.str()));
  201. MORDOR_TEST_ASSERT_EQUAL(port->val(), 80);
  202. MORDOR_TEST_ASSERT_EQUAL(quantity->val(), 654321);
  203. MORDOR_TEST_ASSERT_EQUAL(Config::lookup("http.host")->toString(), "192.168.0.1");
  204. MORDOR_TEST_ASSERT_EQUAL(Config::lookup("price")->toString(), "800.34");
  205. }
  206. MORDOR_UNITTEST(Config, configVarNameFromJSONValid)
  207. {
  208. std::ostringstream ss;
  209. ss << "s3:\n"
  210. << " host: 192.168.1.1\n";
  211. JSON::Value json = YAML::parse(ss.str());
  212. MORDOR_TEST_ASSERT(!json["s3"]["host"].isBlank());
  213. Config::loadFromJSON(json);
  214. MORDOR_TEST_ASSERT(Config::lookup("s3.host"));
  215. MORDOR_TEST_ASSERT_EQUAL(Config::lookup("s3.host")->toString(), "192.168.1.1");
  216. }
  217. MORDOR_UNITTEST(Config, configVarNameFromJSONInvalid)
  218. {
  219. // dot (.) can't be used as ConfigVar name in loadFromJSON case
  220. std::ostringstream ss("s3.host: 192.168.1.1\n");
  221. JSON::Value json = YAML::parse(ss.str());
  222. MORDOR_TEST_ASSERT(json.find("s3.host") != json.end());
  223. Config::loadFromJSON(json);
  224. MORDOR_TEST_ASSERT(!Config::lookup("s3.host"));
  225. }
  226. #endif
  227. MORDOR_UNITTEST(Config, lockConfigVar)
  228. {
  229. ConfigVar<int>::ptr var1 = Config::lookup(
  230. "test.lockable", 100, "configvar can be locked", true);
  231. ConfigVar<int>::ptr var2 = Config::lookup(
  232. "test.unlockable", 200, "configvar can't be locked", false);
  233. MORDOR_TEST_ASSERT_EQUAL(Config::isLocked(), false);
  234. MORDOR_TEST_ASSERT_EQUAL(var1->val(101), true);
  235. MORDOR_TEST_ASSERT_EQUAL(var2->val(202), true);
  236. MORDOR_TEST_ASSERT_EQUAL(var1->val(), 101);
  237. MORDOR_TEST_ASSERT_EQUAL(var2->val(), 202);
  238. Config::lock(true);
  239. MORDOR_TEST_ASSERT_EQUAL(Config::isLocked(), true);
  240. MORDOR_TEST_ASSERT_EQUAL(var1->val(111), false);
  241. MORDOR_TEST_ASSERT_EQUAL(var2->val(222), true);
  242. MORDOR_TEST_ASSERT_EQUAL(var1->val(), 101);
  243. MORDOR_TEST_ASSERT_EQUAL(var2->val(), 222);
  244. }