4 #include <boost/test/included/unit_test.hpp>
5 #include "schedule_module_control.h"
6 #include "schedule_module_control_test.h"
11 using namespace boost::unit_test;
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 );
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 );
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();
31 // unit_test[4] initializeメソッドの呼び出しのチェック(正常系その1)
32 control.initialize( "." );
34 // unit_test[5] initialize 引数で指定されたモジュールのパスが設定されていることのチェック
35 BOOST_CHECK_EQUAL( control.get_modulefile_path(), "." );
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 );
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();
50 // unit_test[8] finalizeメソッドの呼び出しのチェック
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();
58 // unit_test[] load_moduleメソッドのテスト initializeしないでロードした場合
59 l7vs::schedule_module_base* schedule1 = NULL;
61 schedule1 = control.load_module( PM1 );
64 BOOST_ERROR( "exception : load_module" );
66 BOOST_CHECK( schedule1 != NULL );
67 BOOST_CHECK( dlerror() == NULL );
68 control.unload_module( schedule1 );
70 // unit_test[9] load_moduleメソッド ロードするモジュール名が存在しない場合のチェック
71 l7vs::schedule_module_base* schedule2 = NULL;
73 schedule2 = control.load_module( "error" );
76 BOOST_ERROR( "exception : load_module" );
78 BOOST_CHECK( schedule2 == NULL );
79 control.unload_module( schedule2 );
81 // unit_test[10] load_moduleメソッドのテスト(正常系)戻り値がNULLでないことのチェック
82 control.initialize( "." );
83 l7vs::schedule_module_base* schedule3 = NULL;
85 schedule3 = control.load_module( PM1 );
88 BOOST_ERROR( "exception : load_module" );
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 );
105 // unit_test[16] load_moduleメソッドのテスト(正常系)同じモジュールを再ロードした場合のチェック
106 l7vs::schedule_module_base* schedule4 = NULL;
108 schedule4 = control.load_module( PM1 );
111 BOOST_ERROR( "exception : load_module" );
113 BOOST_CHECK( schedule4 != NULL );
114 // unit_test[17] load_module 前回ロードしたモジュールのインスタンスと別のインスタンスであることのチェック
115 BOOST_CHECK( schedule3 != schedule4 );
117 // unit_test[18] load_module ロードモジュールのマップのロードしたモジュールの参照回数が増加していることのチェック1→2
118 it = loadmodulemap.find( PM1 );
119 BOOST_CHECK_EQUAL( it->second.ref_count, (unsigned int)2 );
121 // unit_test[19] load_moduleメソッドのテスト(正常系)前回のモジュールをロードしたまま、新たに別のモジュールをロードした場合のチェック
122 l7vs::schedule_module_base* schedule5 = NULL;
124 schedule5 = control.load_module( PM2 );
127 BOOST_ERROR( "exception : load_module" );
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 );
138 control.unload_module( schedule3 );
139 control.unload_module( schedule4 );
140 control.unload_module( schedule5 );
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( "." );
149 // unit_test[22] unload_moduleメソッドのテスト(正常系) 1回だけロードしたモジュールをアンロードする場合のチェック
150 l7vs::schedule_module_base* schedule1 = NULL;
152 schedule1 = control.load_module( PM1 );
155 BOOST_ERROR( "exception : load_module" );
157 control.unload_module( schedule1 );
159 // unit_test[23] unload_moduleメソッドのテスト(正常系) 2回ロードしたモジュールをアンロードする場合のチェック
160 l7vs::schedule_module_base* schedule2 = NULL;
162 schedule2 = control.load_module( PM1 );
165 BOOST_ERROR( "exception : load_module" );
167 l7vs::schedule_module_base* schedule3 = NULL;
169 schedule3 = control.load_module( PM1 );
172 BOOST_ERROR( "exception : load_module" );
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 );
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 );
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 );
192 // unit_test[26] unload_moduleメソッドのテスト(異常系) 引数がNULLの場合のチェック
193 l7vs::schedule_module_base* schedule4 = NULL;
194 control.unload_module( schedule4 );
195 BOOST_CHECK( dlerror() == NULL );
198 // unit_test[] unload_moduleメソッドのテスト(異常系) アンロードするモジュールを2回unloadした場合のチェック
199 l7vs::schedule_module_base* schedule5 = NULL;
201 schedule5 = control.load_module( PM1 );
204 BOOST_ERROR( "exception : load_module" );
206 control.unload_module( schedule5 );
207 BOOST_CHECK( dlerror() == NULL );
208 control.unload_module( schedule5 );
209 BOOST_CHECK( dlerror() == NULL );
214 test_suite* init_unit_test_suite( int argc, char* argv[] ){
217 // l7vs::Parameter param;
219 // create unit test suite
220 test_suite* ts = BOOST_TEST_SUITE( "schedule_module_control" );
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 ) );
229 framework::master_test_suite().add( ts );