OSDN Git Service

Merge pull request #36314 (suigintoh/ultramonkey-l7-v3/fix_signum_cast into master).
[ultramonkey-l7/ultramonkey-l7-v3.git] / l7vsd / unit_tests / module_controls_test / schedule_module_control / schedule_module_control_test.cpp
1
2 #include <iostream>
3 #include <dlfcn.h>
4 #include <boost/test/included/unit_test.hpp>
5 #include "schedule_module_control.h"
6 #include "schedule_module_control_test.h"
7 #include "logger.h"
8 #include "parameter.h"
9
10 using namespace l7vs;
11 using namespace boost::unit_test;
12
13 void    schedule_module_control_getInstance_test()
14 {
15         BOOST_TEST_MESSAGE("schedule_module_control_getInstance_test");
16         // unit_test[1]  getInstance 取得したインスタンスが一致していることのチェック
17         schedule_module_control &control = schedule_module_control::getInstance();
18         schedule_module_control &control_2 = schedule_module_control::getInstance();
19         BOOST_CHECK_EQUAL(&control, &control_2);
20
21         schedule_module_control_testclass &control_3 = schedule_module_control_testclass::getInstance();
22         // unit_test[2]  getInstance modulefile_pathのデフォルト値のチェック
23         BOOST_CHECK_EQUAL(control_3.get_modulefile_path(), "");
24         // unit_test[3]  getInstance ロードモジュールのマップのデフォルトサイズのチェック
25         schedule_module_control::name_module_info_map &loadmodulemap = control_3.get_loadmodule_map();
26         BOOST_CHECK_EQUAL(loadmodulemap.size(), (size_t)0);
27 }
28
29 void    schedule_module_control_initialize_test()
30 {
31         BOOST_TEST_MESSAGE("schedule_module_control_initialize_test");
32         schedule_module_control_testclass &control = schedule_module_control_testclass::getInstance();
33
34         // unit_test[4]  initializeメソッドの呼び出しのチェック(正常系その1)
35         control.initialize(".");
36
37         // unit_test[5]  initialize 引数で指定されたモジュールのパスが設定されていることのチェック
38         BOOST_CHECK_EQUAL(control.get_modulefile_path(), ".");
39         control.finalize();
40
41         // unit_test[6]  initializeメソッドの呼び出しのチェック(正常系その2) 指定するパスを変えた場合
42         std::string modulename("./schedule");
43         control.initialize(modulename);
44         // unit_test[7]  initialize 引数で指定されたモジュールのパスが設定されていることのチェック
45         BOOST_CHECK_EQUAL(control.get_modulefile_path(), modulename);
46         control.finalize();
47 }
48
49 void    schedule_module_control_finalize_test()
50 {
51         BOOST_TEST_MESSAGE("schedule_module_control_finalize_test");
52         schedule_module_control_testclass &control = schedule_module_control_testclass::getInstance();
53
54         // unit_test[8]  finalizeメソッドの呼び出しのチェック
55         control.finalize();
56 }
57
58 void    schedule_module_control_load_test()
59 {
60         BOOST_TEST_MESSAGE("schedule_module_control_load_test");
61         schedule_module_control_testclass &control = schedule_module_control_testclass::getInstance();
62 #if 0
63         // unit_test[]  load_moduleメソッドのテスト initializeしないでロードした場合
64         l7vs::schedule_module_base        *schedule1 = NULL;
65         try {
66                 schedule1 = control.load_module(PM1);
67         } catch (...) {
68                 BOOST_ERROR("exception : load_module");
69         }
70         BOOST_CHECK(schedule1 != NULL);
71         BOOST_CHECK(dlerror() == NULL);
72         control.unload_module(schedule1);
73 #endif
74         // unit_test[9]  load_moduleメソッド ロードするモジュール名が存在しない場合のチェック
75         l7vs::schedule_module_base        *schedule2 = NULL;
76         try {
77                 schedule2 = control.load_module("error");
78         } catch (...) {
79                 BOOST_ERROR("exception : load_module");
80         }
81         BOOST_CHECK(schedule2 == NULL);
82         control.unload_module(schedule2);
83
84         // unit_test[10]  load_moduleメソッドのテスト(正常系)戻り値がNULLでないことのチェック
85         control.initialize(".");
86         l7vs::schedule_module_base        *schedule3 = NULL;
87         try {
88                 schedule3 = control.load_module(PM1);
89         } catch (...) {
90                 BOOST_ERROR("exception : load_module");
91         }
92         BOOST_CHECK(schedule3 != NULL);
93         // unit_test[11]  load_module ロードモジュールのマップに追加され、マップのサイズが変わっていることのチェック
94         schedule_module_control::name_module_info_map &loadmodulemap = control.get_loadmodule_map();
95         BOOST_CHECK_EQUAL(loadmodulemap.size(), (size_t)1);
96         // unit_test[12]  load_module ロードモジュールのマップのロードしたモジュールの参照回数が増加していることのチェック0→1
97         schedule_module_control::name_module_info_map::iterator it;
98         it = loadmodulemap.find(PM1);
99         BOOST_CHECK_EQUAL(it->second.ref_count, (unsigned int)1);
100         // unit_test[13]  load_module 指定したモジュールのdlopenの戻り値のhandleのチェック
101         BOOST_CHECK(it->second.handle != NULL);
102         // unit_test[14]  load_module 指定したモジュールのdlsymの戻り値のcreate_funcのチェック
103         BOOST_CHECK(it->second.create_func != NULL);
104         // unit_test[15]  load_module 指定したモジュールのdlsymの戻り値のdestroy_funcのチェック
105         BOOST_CHECK(it->second.destroy_func != NULL);
106
107         // unit_test[16]  load_moduleメソッドのテスト(正常系)同じモジュールを再ロードした場合のチェック
108         l7vs::schedule_module_base        *schedule4 = NULL;
109         try {
110                 schedule4 = control.load_module(PM1);
111         } catch (...) {
112                 BOOST_ERROR("exception : load_module");
113         }
114         BOOST_CHECK(schedule4 != NULL);
115         // unit_test[17]  load_module 前回ロードしたモジュールのインスタンスと別のインスタンスであることのチェック
116         BOOST_CHECK(schedule3 != schedule4);
117
118         // unit_test[18]  load_module ロードモジュールのマップのロードしたモジュールの参照回数が増加していることのチェック1→2
119         it = loadmodulemap.find(PM1);
120         BOOST_CHECK_EQUAL(it->second.ref_count, (unsigned int)2);
121
122         // unit_test[19]  load_moduleメソッドのテスト(正常系)前回のモジュールをロードしたまま、新たに別のモジュールをロードした場合のチェック
123         l7vs::schedule_module_base        *schedule5 = NULL;
124         try {
125                 schedule5 = control.load_module(PM2);
126         } catch (...) {
127                 BOOST_ERROR("exception : load_module");
128         }
129         BOOST_CHECK(schedule5 != NULL);
130         // unit_test[20]  load_module 新たにロードしたモジュールが別のインスタンスであることのチェック
131         BOOST_CHECK(schedule4 != schedule5);
132         // unit_test[21]  load_module 新たにロードモジュールのマップに追加され、マップのサイズが変わっていることのチェック
133         BOOST_CHECK_EQUAL(loadmodulemap.size(), (size_t)2);
134         // load_module ロードモジュールのマップのロードしたモジュールの参照回数が増加していることのチェック0→1
135         it = loadmodulemap.find(PM2);
136         BOOST_CHECK_EQUAL(it->second.ref_count, (unsigned int)1);
137
138         control.unload_module(schedule3);
139         control.unload_module(schedule4);
140         control.unload_module(schedule5);
141         control.finalize();
142 }
143
144 void    schedule_module_control_unload_test()
145 {
146         BOOST_TEST_MESSAGE("schedule_module_control_unload_test");
147         schedule_module_control_testclass &control = schedule_module_control_testclass::getInstance();
148         control.initialize(".");
149
150         // unit_test[22]  unload_moduleメソッドのテスト(正常系) 1回だけロードしたモジュールをアンロードする場合のチェック
151         l7vs::schedule_module_base        *schedule1 = NULL;
152         try {
153                 schedule1 = control.load_module(PM1);
154         } catch (...) {
155                 BOOST_ERROR("exception : load_module");
156         }
157         control.unload_module(schedule1);
158
159         // unit_test[23]  unload_moduleメソッドのテスト(正常系) 2回ロードしたモジュールをアンロードする場合のチェック
160         l7vs::schedule_module_base        *schedule2 = NULL;
161         try {
162                 schedule2 = control.load_module(PM1);
163         } catch (...) {
164                 BOOST_ERROR("exception : load_module");
165         }
166         l7vs::schedule_module_base        *schedule3 = NULL;
167         try {
168                 schedule3 = control.load_module(PM1);
169         } catch (...) {
170                 BOOST_ERROR("exception : load_module");
171         }
172         schedule_module_control::name_module_info_map &loadmodulemap = control.get_loadmodule_map();
173         BOOST_CHECK_EQUAL(loadmodulemap.size(), (size_t)1);
174         schedule_module_control::name_module_info_map::iterator it;
175         it = loadmodulemap.find(PM1);
176
177         control.unload_module(schedule2);
178         BOOST_CHECK_EQUAL(loadmodulemap.size(), (size_t)1);
179         // unit_test[24]  unload_module ロードモジュールのマップのロードしたモジュールの参照回数が減少していることのチェック2→1
180         it = loadmodulemap.find(PM1);
181         BOOST_CHECK_EQUAL(it->second.ref_count, (unsigned int)1);
182
183         control.unload_module(schedule3);
184         // unload_module ロードモジュールのマップのロードしたモジュールの参照回数が減少していることのチェック1→0
185         it = loadmodulemap.find(PM1);
186         BOOST_CHECK_EQUAL(it->second.ref_count, (unsigned int)0);
187         // unit_test[25]  unload_module ロードモジュールのマップから削除されたことのチェック
188         BOOST_CHECK_EQUAL(loadmodulemap.size(), (size_t)0);
189
190         // unit_test[26]  unload_moduleメソッドのテスト(異常系) 引数がNULLの場合のチェック
191         l7vs::schedule_module_base        *schedule4 = NULL;
192         control.unload_module(schedule4);
193         BOOST_CHECK(dlerror() == NULL);
194
195 #if 0
196         // unit_test[]  unload_moduleメソッドのテスト(異常系) アンロードするモジュールを2回unloadした場合のチェック
197         l7vs::schedule_module_base        *schedule5 = NULL;
198         try {
199                 schedule5 = control.load_module(PM1);
200         } catch (...) {
201                 BOOST_ERROR("exception : load_module");
202         }
203         control.unload_module(schedule5);
204         BOOST_CHECK(dlerror() == NULL);
205         control.unload_module(schedule5);
206         BOOST_CHECK(dlerror() == NULL);
207 #endif
208         control.finalize();
209 }
210
211 test_suite    *init_unit_test_suite(int argc, char *argv[])
212 {
213
214 //    Logger logger;
215 //    l7vs::Parameter param;
216
217         // create unit test suite
218         test_suite *ts = BOOST_TEST_SUITE("schedule_module_control");
219
220         // add test case to test suite
221         ts->add(BOOST_TEST_CASE(&schedule_module_control_getInstance_test));
222         ts->add(BOOST_TEST_CASE(&schedule_module_control_initialize_test));
223         ts->add(BOOST_TEST_CASE(&schedule_module_control_finalize_test));
224         ts->add(BOOST_TEST_CASE(&schedule_module_control_load_test));
225         ts->add(BOOST_TEST_CASE(&schedule_module_control_unload_test));
226
227         framework::master_test_suite().add(ts);
228
229         return 0;
230 }