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& control = schedule_module_control::getInstance();
17 schedule_module_control& control_2 = schedule_module_control::getInstance();
18 BOOST_CHECK_EQUAL( &control, &control_2 );
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 );
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();
32 // unit_test[4] initializeメソッドの呼び出しのチェック(正常系その1)
33 control.initialize( "." );
35 // unit_test[5] initialize 引数で指定されたモジュールのパスが設定されていることのチェック
36 BOOST_CHECK_EQUAL( control.get_modulefile_path(), "." );
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 );
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();
51 // unit_test[8] finalizeメソッドの呼び出しのチェック
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();
59 // unit_test[] load_moduleメソッドのテスト initializeしないでロードした場合
60 l7vs::schedule_module_base* schedule1 = NULL;
62 schedule1 = control.load_module( PM1 );
65 BOOST_ERROR( "exception : load_module" );
67 BOOST_CHECK( schedule1 != NULL );
68 BOOST_CHECK( dlerror() == NULL );
69 control.unload_module( schedule1 );
71 // unit_test[9] load_moduleメソッド ロードするモジュール名が存在しない場合のチェック
72 l7vs::schedule_module_base* schedule2 = NULL;
74 schedule2 = control.load_module( "error" );
77 BOOST_ERROR( "exception : load_module" );
79 BOOST_CHECK( schedule2 == NULL );
80 control.unload_module( schedule2 );
82 // unit_test[10] load_moduleメソッドのテスト(正常系)戻り値がNULLでないことのチェック
83 control.initialize( "." );
84 l7vs::schedule_module_base* schedule3 = NULL;
86 schedule3 = control.load_module( PM1 );
89 BOOST_ERROR( "exception : load_module" );
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 );
106 // unit_test[16] load_moduleメソッドのテスト(正常系)同じモジュールを再ロードした場合のチェック
107 l7vs::schedule_module_base* schedule4 = NULL;
109 schedule4 = control.load_module( PM1 );
112 BOOST_ERROR( "exception : load_module" );
114 BOOST_CHECK( schedule4 != NULL );
115 // unit_test[17] load_module 前回ロードしたモジュールのインスタンスと別のインスタンスであることのチェック
116 BOOST_CHECK( schedule3 != schedule4 );
118 // unit_test[18] load_module ロードモジュールのマップのロードしたモジュールの参照回数が増加していることのチェック1→2
119 it = loadmodulemap.find( PM1 );
120 BOOST_CHECK_EQUAL( it->second.ref_count, (unsigned int)2 );
122 // unit_test[19] load_moduleメソッドのテスト(正常系)前回のモジュールをロードしたまま、新たに別のモジュールをロードした場合のチェック
123 l7vs::schedule_module_base* schedule5 = NULL;
125 schedule5 = control.load_module( PM2 );
128 BOOST_ERROR( "exception : load_module" );
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 );
139 control.unload_module( schedule3 );
140 control.unload_module( schedule4 );
141 control.unload_module( schedule5 );
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( "." );
150 // unit_test[22] unload_moduleメソッドのテスト(正常系) 1回だけロードしたモジュールをアンロードする場合のチェック
151 l7vs::schedule_module_base* schedule1 = NULL;
153 schedule1 = control.load_module( PM1 );
156 BOOST_ERROR( "exception : load_module" );
158 control.unload_module( schedule1 );
160 // unit_test[23] unload_moduleメソッドのテスト(正常系) 2回ロードしたモジュールをアンロードする場合のチェック
161 l7vs::schedule_module_base* schedule2 = NULL;
163 schedule2 = control.load_module( PM1 );
166 BOOST_ERROR( "exception : load_module" );
168 l7vs::schedule_module_base* schedule3 = NULL;
170 schedule3 = control.load_module( PM1 );
173 BOOST_ERROR( "exception : load_module" );
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 );
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 );
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 );
193 // unit_test[26] unload_moduleメソッドのテスト(異常系) 引数がNULLの場合のチェック
194 l7vs::schedule_module_base* schedule4 = NULL;
195 control.unload_module( schedule4 );
196 BOOST_CHECK( dlerror() == NULL );
199 // unit_test[] unload_moduleメソッドのテスト(異常系) アンロードするモジュールを2回unloadした場合のチェック
200 l7vs::schedule_module_base* schedule5 = NULL;
202 schedule5 = control.load_module( PM1 );
205 BOOST_ERROR( "exception : load_module" );
207 control.unload_module( schedule5 );
208 BOOST_CHECK( dlerror() == NULL );
209 control.unload_module( schedule5 );
210 BOOST_CHECK( dlerror() == NULL );
215 test_suite* init_unit_test_suite( int argc, char* argv[] ){
218 // l7vs::Parameter param;
220 // create unit test suite
221 test_suite* ts = BOOST_TEST_SUITE( "schedule_module_control" );
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 ) );
230 framework::master_test_suite().add( ts );