OSDN Git Service

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