OSDN Git Service

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