00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <cstdlib>
00027 #include <cstring>
00028
00029 #include <scalestack/kernel/service.h>
00030 #include <scalestack/kernel/test.h>
00031
00032 using namespace std;
00033 using namespace scalestack;
00034
00035 class test_suite: public scalestack::kernel::test_suite<test_suite>
00036 {
00037 public:
00038
00039 void test_constructor(void)
00040 {
00041 }
00042
00043 void test_parse_arguments(void)
00044 {
00045 const char* argv[] =
00046 {
00047 "v",
00048 "-h",
00049 "--help",
00050 "test_child"
00051 "test_child=value1",
00052 "test_parent.option1",
00053 "test_parent.option2=value2"
00054 };
00055 core->parse_arguments(sizeof(argv) / sizeof(const char*), argv);
00056 }
00057
00058 void test_parse_paths(void)
00059 {
00060 const char* argv[] =
00061 {
00062 "p=/path/to/modules",
00063 "path=/another/path/to/modules"
00064 };
00065 core->parse_arguments(2, argv);
00066 }
00067
00068 void test_parse_bad_paths(void)
00069 {
00070 const char* argv[] =
00071 {
00072 "path"
00073 };
00074 assert_exception(core->parse_arguments(1, argv));
00075 argv[0] = "path.a";
00076 assert_exception(core->parse_arguments(1, argv));
00077 }
00078
00079 void test_parse_files(void)
00080 {
00081 const char* argv[] =
00082 {
00083 "f=" SCALESTACK_SOURCE_PATH "/scalestack/kernel/test/config_file1",
00084 "file=" SCALESTACK_SOURCE_PATH "/scalestack/kernel/test/config_file2"
00085 };
00086 core->parse_arguments(2, argv);
00087 }
00088
00089 void test_parse_bad_files(void)
00090 {
00091 const char* argv[] =
00092 {
00093 "file"
00094 };
00095 assert_exception(core->parse_arguments(1, argv));
00096 argv[0] = "file.a";
00097 assert_exception(core->parse_arguments(1, argv));
00098 argv[0] = "file=bad_file";
00099 assert_exception(core->parse_arguments(1, argv));
00100 argv[0] = "file=" SCALESTACK_SOURCE_PATH
00101 "/scalestack/kernel/test/config_file4";
00102 assert_exception(core->parse_arguments(1, argv));
00103 }
00104
00105 void test_bad_option(void)
00106 {
00107 const char* argv[] =
00108 {
00109 ""
00110 };
00111 assert_exception(core->parse_arguments(1, argv));
00112 argv[0] = ".option=value";
00113 assert_exception(core->parse_arguments(1, argv));
00114 argv[0] = "=value";
00115 assert_exception(core->parse_arguments(1, argv));
00116 }
00117
00118 void test_long_option(void)
00119 {
00120 const size_t long_option_size = 1024 * 128;
00121 char* long_option = static_cast<char*>(malloc(long_option_size));
00122 assert(long_option != NULL);
00123 const char* argv[] =
00124 {
00125 long_option
00126 };
00127
00128 memset(long_option, 'A', long_option_size - 1);
00129 long_option[long_option_size - 1] = '\0';
00130 long_option[long_option_size / 3] = '.';
00131 long_option[(long_option_size / 3) * 2] = '=';
00132
00133 core->parse_arguments(1, argv);
00134 free(long_option);
00135 }
00136
00137 void test_long_option_list(void)
00138 {
00139
00140 kernel::core new_core;
00141 const size_t argc = 1024 * 128;
00142 const char** argv = static_cast<const char**>(malloc(sizeof(char*) * argc));
00143
00144 for (size_t x = 0; x < argc; x++)
00145 argv[x] = const_cast<char*>("module.option=value");
00146
00147 new_core.parse_arguments(argc, argv);
00148 free(argv);
00149 }
00150
00151 void test_add_module_option_value(void)
00152 {
00153 core->add_module_option_value("module", "option", "value");
00154 core->get_module("module");
00155 assert_exception(core->add_module_option_value("", "option", "value"));
00156 core->add_module_option_value("module", "", "value");
00157 core->add_module_option_value("module", "option", "");
00158 assert_exception(core->add_module_option_value("", "", "value"));
00159 assert_exception(core->add_module_option_value("", "option", ""));
00160 core->add_module_option_value("module", "", "");
00161 assert_exception(core->add_module_option_value("", "", ""));
00162 }
00163
00164 void test_set_signal_handlers(void)
00165 {
00166 core->set_signal_handlers();
00167 assert_exception(core->set_signal_handlers());
00168 }
00169
00170 void test_handle_signal(void)
00171 {
00172 core->handle_signal(0);
00173 }
00174
00175 void test_get_or_add_module(void)
00176 {
00177 kernel::module& module = core->get_or_add_module("module");
00178 assert(&core->get_or_add_module("module") == &module);
00179
00180 kernel::module& module2 = core->get_or_add_module("module2");
00181 assert(&core->get_or_add_module("module2") == &module2);
00182 assert(&core->get_or_add_module("module2") != &module);
00183 }
00184
00185 void test_get_module(void)
00186 {
00187 kernel::module& module = core->get_or_add_module("module");
00188 assert(&core->get_module("module") == &module);
00189 assert_exception(core->get_module("bad_module"));
00190 }
00191
00192 void test_get_module_count(void)
00193 {
00194 assert(core->get_module_count() == 0);
00195 core->get_or_add_module("module");
00196 assert(core->get_module_count() == 1);
00197 core->get_or_add_module("module2");
00198 assert(core->get_module_count() == 2);
00199 core->get_or_add_module("module2");
00200 assert(core->get_module_count() == 2);
00201 }
00202
00203 void test_get_or_add_module_normalize(void)
00204 {
00205 assert(core->get_module_count() == 0);
00206 core->get_or_add_module("module_test");
00207 assert(core->get_module_count() == 1);
00208 core->get_or_add_module("MODULE_TEST");
00209 assert(core->get_module_count() == 1);
00210 core->get_or_add_module("module::test");
00211 assert(core->get_module_count() == 1);
00212 }
00213
00214 void test_module_scan(void)
00215 {
00216 assert(core->begin_module() == NULL);
00217 assert(core->next_module() == NULL);
00218
00219 kernel::module& module = core->get_or_add_module("module");
00220 assert(core->begin_module() == &module);
00221 assert(core->next_module() == NULL);
00222
00223 kernel::module& module2 = core->get_or_add_module("module2");
00224 assert(core->begin_module() == &module);
00225 assert(core->next_module() == &module2);
00226 assert(core->next_module() == NULL);
00227 }
00228
00229 void test_add_service(void)
00230 {
00231 kernel::module& module = core->get_or_add_module("module");
00232 kernel::service service(module);;
00233 core->add_service("service1", &service);
00234 core->add_service("service2", &service);
00235 assert_exception(core->add_service("service2", &service));
00236 assert(&service.get_module() == &module);
00237 }
00238
00239 void test_remove_service(void)
00240 {
00241 kernel::module& module = core->get_or_add_module("module");
00242 kernel::service service(module);
00243 kernel::service service2(module);
00244 core->add_service("service1", &service);
00245 core->add_service("service2", &service2);
00246 assert(core->remove_service("service1") == &service);
00247 assert(core->remove_service("service2") == &service2);
00248 assert_exception(core->remove_service("service2"));
00249 }
00250
00251 void test_get_service(void)
00252 {
00253 kernel::module& module = core->get_or_add_module("module");
00254 kernel::service service(module);
00255 kernel::service service2(module);
00256 core->add_service("service1", &service);
00257 core->add_service("service2", &service2);
00258 assert(&core->get_service("service1") == &service);
00259 assert(&core->get_service("service1") == &service);
00260 assert(&core->get_service("service2") == &service2);
00261 assert_exception(core->get_service("service3"));
00262 }
00263
00264 class log_test: public kernel::log
00265 {
00266 public:
00267 size_t errors;
00268 log_test(void): errors() {}
00269 void write_log(kernel::log::level log_level, const char*, const char*)
00270 {
00271 if (log_level == kernel::log::LEVEL_ERROR)
00272 errors++;
00273 }
00274 };
00275
00276 void test_add_log(void)
00277 {
00278 log_test log;
00279 core->add_log("log1", &log);
00280 core->add_log("log2", &log);
00281 assert_exception(core->add_log("log2", &log));
00282 core->remove_log("log1");
00283 core->remove_log("log2");
00284 }
00285
00286 void test_remove_log(void)
00287 {
00288 log_test log;
00289 log_test log2;
00290 core->add_log("log1", &log);
00291 core->add_log("log2", &log2);
00292 assert(core->remove_log("log1") == &log);
00293 assert(core->remove_log("log2") == &log2);
00294 assert_exception(core->remove_log("log2"));
00295 }
00296
00297 void test_get_log(void)
00298 {
00299 log_test log;
00300 log_test log2;
00301 core->add_log("log1", &log);
00302 core->add_log("log2", &log2);
00303 assert(&core->get_log("log1") == &log);
00304 assert(&core->get_log("log1") == &log);
00305 assert(&core->get_log("log2") == &log2);
00306 assert_exception(core->get_log("log3"));
00307 core->remove_log("log1");
00308 core->remove_log("log2");
00309 }
00310
00311 void test_unremoved_log(void)
00312 {
00313 cout << _("Testing unremoved logs, ignore the following output:") << endl;
00314 log_test log1;
00315 log_test log2;
00316
00317 {
00318 kernel::core new_core;
00319
00320
00321 const char* argv[] =
00322 {
00323 "v"
00324 };
00325 new_core.parse_arguments(1, argv);
00326
00327
00328
00329
00330 new_core.add_log("log1", &log1);
00331 new_core.add_log("log2", &log2);
00332
00333
00334 }
00335
00336
00337 assert(log1.errors == 3);
00338 }
00339
00340 void test_run(void)
00341 {
00342 cout << _("Testing exception message, ignore the following output:") <<
00343 endl;
00344 bool run_failed = false;
00345 try
00346 {
00347 core->run();
00348 }
00349 catch (exception& e)
00350 {
00351 cout << e.what() << endl;
00352 run_failed = true;
00353 }
00354 assert(run_failed);
00355 }
00356
00357 void test_threshold(void)
00358 {
00359 const char* argv[] =
00360 {
00361 "v",
00362 };
00363 size_t old_threshold = core->get_threshold();
00364 core->parse_arguments(1, argv);
00365 assert(core->get_threshold() == (old_threshold + 1));
00366 argv[0] = "v=3";
00367 core->parse_arguments(1, argv);
00368 assert(core->get_threshold() == 3);
00369 core->set_threshold(4);
00370 assert(core->get_threshold() == 4);
00371 }
00372
00373 void test_run_verbose(void)
00374 {
00375 const char* argv[] =
00376 {
00377 "vvvv",
00378 };
00379 core->parse_arguments(1, argv);
00380 cout << _("Testing verbose messages, ignore the following output:") << endl;
00381 assert_exception(core->run());
00382 }
00383
00384 void test_shutdown(void)
00385 {
00386 core->shutdown();
00387 }
00388
00389 void test_print_help(void)
00390 {
00391 const char* argv[] =
00392 {
00393 "help",
00394 };
00395 core->parse_arguments(1, argv);
00396 cout << _("Testing help messages, ignore the following output:") << endl;
00397 core->run();
00398 }
00399
00400 void test_print_config(void)
00401 {
00402 const char* argv[] =
00403 {
00404 "config",
00405 "a=b",
00406 };
00407 core->parse_arguments(2, argv);
00408 cout << _("Testing config messages, ignore the following output:") << endl;
00409 core->run();
00410 }
00411
00412 void test_alias(void)
00413 {
00414 kernel::module& module = core->get_or_add_module("module");
00415 kernel::module& module2 = core->get_or_add_module("module2");
00416 core->add_module_option_value("module_a", "", "module");
00417 assert(&core->get_module("module_a") == &module);
00418 core->add_module_option_value("module_a", "", "module2");
00419 assert(&core->get_module("module_a") == &module2);
00420 }
00421
00422 test_suite(int argc, const char** argv):
00423 scalestack::kernel::test_suite<test_suite>(argc, argv)
00424 {
00425 test_case(test_suite::test_constructor);
00426 test_case(test_suite::test_parse_arguments);
00427 test_case(test_suite::test_parse_paths);
00428 test_case(test_suite::test_parse_bad_paths);
00429 test_case(test_suite::test_parse_files);
00430 test_case(test_suite::test_parse_bad_files);
00431 test_case(test_suite::test_bad_option);
00432 test_case(test_suite::test_long_option);
00433 test_case(test_suite::test_long_option_list);
00434 test_case(test_suite::test_add_module_option_value);
00435 test_case(test_suite::test_set_signal_handlers);
00436 test_case(test_suite::test_handle_signal);
00437 test_case(test_suite::test_get_or_add_module);
00438 test_case(test_suite::test_get_module);
00439 test_case(test_suite::test_get_module_count);
00440 test_case(test_suite::test_get_or_add_module_normalize);
00441 test_case(test_suite::test_module_scan);
00442 test_case(test_suite::test_add_service);
00443 test_case(test_suite::test_remove_service);
00444 test_case(test_suite::test_get_service);
00445 test_case(test_suite::test_add_log);
00446 test_case(test_suite::test_remove_log);
00447 test_case(test_suite::test_get_log);
00448 test_case(test_suite::test_unremoved_log);
00449 test_case(test_suite::test_run);
00450 test_case(test_suite::test_threshold);
00451 test_case(test_suite::test_run_verbose);
00452 test_case(test_suite::test_shutdown);
00453 test_case(test_suite::test_print_help);
00454 test_case(test_suite::test_print_config);
00455 test_case(test_suite::test_alias);
00456 }
00457 };
00458
00459 int main(int argc, const char* argv[])
00460 {
00461 test_suite test_suite(argc - 1, argv + 1);
00462 test_suite.run();
00463 return 0;
00464 }