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 std::vector<l7vs::schedule_module_base*> test1_vec;
14 std::vector<l7vs::schedule_module_base*> test2_vec;
15 #define THREAD_LOOP_COUNT 100
17 BOOST_TEST_MESSAGE( "thread1 start" );
18 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
20 l7vs::schedule_module_base* schedule1 = NULL;
21 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
23 schedule1 = control.load_module( PM1 );
26 BOOST_ERROR( "exception : load_module thread1" );
28 test1_vec.push_back(schedule1);
30 BOOST_CHECK_EQUAL( test1_vec.size(), (size_t)THREAD_LOOP_COUNT );
32 std::vector<l7vs::schedule_module_base*>::iterator test1_it = test1_vec.begin();
33 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
34 control.unload_module(*test1_it);
35 test1_it = test1_vec.erase(test1_it);
36 test1_it = test1_vec.begin();
38 BOOST_CHECK_EQUAL( test1_vec.size(), (size_t)0 );
39 BOOST_TEST_MESSAGE( "thread1 stop" );
43 BOOST_TEST_MESSAGE( "thread2 start" );
44 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
46 l7vs::schedule_module_base* schedule2 = NULL;
47 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
49 schedule2 = control.load_module( PM2 );
52 BOOST_ERROR( "exception : load_module thread2" );
54 test2_vec.push_back(schedule2);
56 BOOST_CHECK_EQUAL( test2_vec.size(), (size_t)THREAD_LOOP_COUNT );
58 std::vector<l7vs::schedule_module_base*>::iterator test2_it = test2_vec.begin();
59 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
60 control.unload_module(*test2_it);
61 test2_it = test2_vec.erase(test2_it);
62 test2_it = test2_vec.begin();
64 BOOST_CHECK_EQUAL( test2_vec.size(), (size_t)0 );
65 BOOST_TEST_MESSAGE( "thread2 stop" );
69 BOOST_TEST_MESSAGE( "thread3 start" );
70 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
72 l7vs::schedule_module_base* schedule1 = NULL;
73 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
75 schedule1 = control.load_module( PM1 );
78 BOOST_ERROR( "exception : load_module thread3" );
80 test1_vec.push_back(schedule1);
82 BOOST_CHECK_EQUAL( test1_vec.size(), (size_t)THREAD_LOOP_COUNT );
83 BOOST_TEST_MESSAGE( "thread3 stop" );
87 BOOST_TEST_MESSAGE( "thread4 start" );
88 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
90 l7vs::schedule_module_base* schedule2 = NULL;
91 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
93 schedule2 = control.load_module( PM1 );
96 BOOST_ERROR( "exception : load_module thread4" );
98 test2_vec.push_back(schedule2);
100 BOOST_CHECK_EQUAL( test2_vec.size(), (size_t)THREAD_LOOP_COUNT );
101 BOOST_TEST_MESSAGE( "thread4 stop" );
105 BOOST_TEST_MESSAGE( "thread5 start" );
106 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
107 BOOST_CHECK_EQUAL( test1_vec.size(), (size_t)THREAD_LOOP_COUNT );
108 std::vector<l7vs::schedule_module_base*>::iterator test1_it = test1_vec.begin();
110 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
111 control.unload_module(*test1_it);
112 test1_vec.erase(test1_it);
113 test1_it = test1_vec.begin();
116 for( test1_it = test1_vec.begin(); test1_it != test1_vec.end(); test1_it++ ){
117 control.unload_module(*test1_it);
121 BOOST_TEST_MESSAGE( "thread5 stop" );
125 BOOST_TEST_MESSAGE( "thread6 start" );
126 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
127 BOOST_CHECK_EQUAL( test2_vec.size(), (size_t)THREAD_LOOP_COUNT );
128 std::vector<l7vs::schedule_module_base*>::iterator test2_it = test2_vec.begin();
130 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
131 control.unload_module(*test2_it);
132 test2_vec.erase(test2_it);
133 test2_it = test2_vec.begin();
136 for( test2_it = test2_vec.begin(); test2_it != test2_vec.end(); test2_it++ ){
137 control.unload_module(*test2_it);
141 BOOST_TEST_MESSAGE( "thread6 stop" );
145 BOOST_TEST_MESSAGE( "thread7 start" );
146 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
148 l7vs::schedule_module_base* schedule1 = NULL;
149 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
151 schedule1 = control.load_module( PM1 );
154 BOOST_ERROR( "exception : load_module thread7" );
156 test1_vec.push_back(schedule1);
158 BOOST_CHECK_EQUAL( test1_vec.size(), (size_t)THREAD_LOOP_COUNT );
160 std::vector<l7vs::schedule_module_base*>::iterator test1_it = test1_vec.begin();
161 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
162 control.unload_module(*test1_it);
163 test1_it = test1_vec.erase(test1_it);
164 test1_it = test1_vec.begin();
166 BOOST_CHECK_EQUAL( test1_vec.size(), (size_t)0 );
167 BOOST_TEST_MESSAGE( "thread7 stop" );
171 BOOST_TEST_MESSAGE( "thread8 start" );
172 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
174 l7vs::schedule_module_base* schedule2 = NULL;
175 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
177 schedule2 = control.load_module( PM1 );
180 BOOST_ERROR( "exception : load_module thread8" );
182 test2_vec.push_back(schedule2);
184 BOOST_CHECK_EQUAL( test2_vec.size(), (size_t)THREAD_LOOP_COUNT );
186 std::vector<l7vs::schedule_module_base*>::iterator test2_it = test2_vec.begin();
187 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
188 control.unload_module(*test2_it);
189 test2_it = test2_vec.erase(test2_it);
190 test2_it = test2_vec.begin();
192 BOOST_CHECK_EQUAL( test2_vec.size(), (size_t)0 );
193 BOOST_TEST_MESSAGE( "thread8 stop" );
197 BOOST_TEST_MESSAGE( "thread9 start" );
198 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
199 l7vs::schedule_module_base* schedule1 = NULL;
200 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
202 schedule1 = control.load_module( PM1 );
205 BOOST_ERROR( "exception : load_module thread9" );
207 control.unload_module( schedule1 );
209 BOOST_TEST_MESSAGE( "thread9 stop" );
213 BOOST_TEST_MESSAGE( "thread10 start" );
214 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
215 l7vs::schedule_module_base* schedule2 = NULL;
216 for( int i = 0; i < THREAD_LOOP_COUNT; i++ ){
218 schedule2 = control.load_module( PM2 );
221 BOOST_ERROR( "exception : load_module thread10" );
223 control.unload_module( schedule2 );
225 BOOST_TEST_MESSAGE( "thread10 stop" );
228 void load2_unload2_thread( int id, const std::string& modulename ){
229 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
230 l7vs::schedule_module_base* schedule1 = NULL;
231 schedule1 = control.load_module2( id, modulename );
232 control.unload_module2( id, schedule1 );
237 void load_unload2_thread( int id, const std::string& modulename ){
238 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
239 l7vs::schedule_module_base* schedule1 = NULL;
240 schedule1 = control.load_module( modulename );
241 control.unload_module2( id, schedule1 );
246 void load2_unload_thread( int id, const std::string& modulename ){
247 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
248 l7vs::schedule_module_base* schedule1 = NULL;
249 schedule1 = control.load_module2( id, modulename );
250 control.unload_module( schedule1 );
255 void schedule_module_control_test_thread1(){
256 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
257 control.initialize( "." );
259 schedule_module_control::name_module_info_map& loadmodulemap = control.get_loadmodule_map();
260 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
262 // unit_test[1] スレッド1はPM1のロードとアンロード、スレッド2はPM2のロードとアンロードを行い、最終的にロードモジュールのマップのサイズが0となっていることを確認する
263 boost::thread thd1( &thread1 );
264 boost::thread thd2( &thread2 );
267 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
272 void schedule_module_control_test_thread2(){
273 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
274 control.initialize( "." );
276 schedule_module_control::name_module_info_map& loadmodulemap = control.get_loadmodule_map();
277 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
279 // unit_test[2] スレッド1はPM1のロード、スレッド2はPM1のロードを行い、最終的にロードモジュールのマップのサイズが1となっていることを確認する
280 boost::thread thd1( &thread3 );
281 boost::thread thd2( &thread4 );
284 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)1 );
286 // unit_test[3] スレッド3はPM1のアンロード、スレッド4はPM1のアンロードを行い、最終的にロードモジュールのマップのサイズが0となっていることを確認する
287 boost::thread thd3( &thread5 );
288 boost::thread thd4( &thread6 );
291 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
296 void schedule_module_control_test_thread3(){
297 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
298 control.initialize( "." );
300 schedule_module_control::name_module_info_map& loadmodulemap = control.get_loadmodule_map();
301 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
302 // unit_test[4] スレッド1はPM1のロードとアンロード、スレッド2はPM1のロードとアンロードを行い、最終的にロードモジュールのマップのサイズが0となっていることを確認する
303 boost::thread thd1( &thread7 );
304 boost::thread thd2( &thread8 );
307 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
311 void schedule_module_control_test_thread4(){
312 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
313 control.initialize( "." );
315 schedule_module_control::name_module_info_map& loadmodulemap = control.get_loadmodule_map();
316 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
317 // unit_test[5] スレッド1はPM1のロード/アンロード、スレッド2はPM2のロード/アンロードをそれぞれセットで行い、最終的にロードモジュールのマップのサイズが0となっていることを確認する
318 boost::thread thd1( &thread9 );
319 boost::thread thd2( &thread10 );
322 loadmodulemap = control.get_loadmodule_map();
323 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
327 void schedule_module_control_test_thread5(){
328 schedule_module_control_testclass& control = schedule_module_control_testclass::getInstance();
329 control.initialize( "." );
330 schedule_module_control::name_module_info_map& loadmodulemap = control.get_loadmodule_map();
331 loadmodulemap = control.get_loadmodule_map();
332 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
334 // unit_test[6] load_moduleを複数スレッドからアクセスした場合の動作チェック(同じモジュールを指定した場合)
335 boost::thread thd1( boost::bind( &load2_unload2_thread, 1, PM1 ) );
336 boost::thread thd2( boost::bind( &load2_unload2_thread, 2, PM1 ) );
337 boost::thread thd3( boost::bind( &load2_unload2_thread, 3, PM1 ) );
338 boost::thread thd4( boost::bind( &load2_unload2_thread, 4, PM1 ) );
339 boost::thread thd5( boost::bind( &load2_unload2_thread, 5, PM1 ) );
342 loadmodulemap = control.get_loadmodule_map();
343 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
344 BOOST_MESSAGE( "notify_all" );
345 control.load_condition.notify_all();
348 loadmodulemap = control.get_loadmodule_map();
349 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)1 );
350 // unit_test[7] unload_moduleを複数スレッドからアクセスした場合の動作チェック(同じモジュールを指定した場合)
351 BOOST_MESSAGE( "notify_all" );
352 control.load_condition.notify_all();
360 loadmodulemap = control.get_loadmodule_map();
361 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
363 // unit_test[8] load_moduleとunload_moduleを複数スレッドからアクセスした場合の動作チェック(同じモジュールを指定した場合)
364 boost::thread thd6( boost::bind( &load2_unload_thread, 6, PM1 ) );
365 boost::thread thd7( boost::bind( &load_unload2_thread, 7, PM1 ) );
368 loadmodulemap = control.get_loadmodule_map();
369 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)1 );
370 BOOST_MESSAGE( "notify_all" );
371 control.load_condition.notify_all();
376 loadmodulemap = control.get_loadmodule_map();
377 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
379 // unit_test[9] load_moduleを複数スレッドからアクセスした場合の動作チェック(それぞれ別のモジュールを指定した場合)
380 boost::thread thd8( boost::bind( &load2_unload2_thread, 8, PM1 ) );
381 boost::thread thd9( boost::bind( &load2_unload2_thread, 9, PM2 ) );
384 loadmodulemap = control.get_loadmodule_map();
385 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
386 BOOST_MESSAGE( "notify_all" );
387 control.load_condition.notify_all();
390 loadmodulemap = control.get_loadmodule_map();
391 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)2 );
392 // unit_test[10] unload_moduleを複数スレッドからアクセスした場合の動作チェック(それぞれ別のモジュールを指定した場合)
393 BOOST_MESSAGE( "notify_all" );
394 control.load_condition.notify_all();
399 loadmodulemap = control.get_loadmodule_map();
400 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
402 // unit_test[11] load_moduleとunload_moduleを複数スレッドからアクセスした場合の動作チェック(それぞれ別のモジュールを指定した場合)
403 boost::thread thd10( boost::bind( &load2_unload_thread, 10, PM1 ) );
404 boost::thread thd11( boost::bind( &load_unload2_thread, 11, PM2 ) );
407 loadmodulemap = control.get_loadmodule_map();
408 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)1 );
409 BOOST_MESSAGE( "notify_all" );
410 control.load_condition.notify_all();
415 loadmodulemap = control.get_loadmodule_map();
416 BOOST_CHECK_EQUAL( loadmodulemap.size(), (size_t)0 );
420 test_suite* init_unit_test_suite( int argc, char* argv[] ){
423 // l7vs::Parameter param;
425 // create unit test suite
426 test_suite* ts = BOOST_TEST_SUITE( "schedule_module_control_thread_test" );
428 // add test case to test suite
429 ts->add( BOOST_TEST_CASE( &schedule_module_control_test_thread1 ) );
430 ts->add( BOOST_TEST_CASE( &schedule_module_control_test_thread2 ) );
431 ts->add( BOOST_TEST_CASE( &schedule_module_control_test_thread3 ) );
432 ts->add( BOOST_TEST_CASE( &schedule_module_control_test_thread4 ) );
433 ts->add( BOOST_TEST_CASE( &schedule_module_control_test_thread5 ) );
435 framework::master_test_suite().add( ts );