RingBufferTests.cpp
Go to the documentation of this file.
1 // -*- C++ -*-
21 /*
22  * $Log: RingBufferTests.cpp,v $
23  * Revision 1.3 2008/01/24 01:52:14 tsakamoto
24  * *** empty log message ***
25  *
26  * Revision 1.2 2008/01/11 11:27:11 arafune
27  * *** empty log message ***
28  *
29  * Revision 1.1 2007/12/20 07:50:17 arafune
30  * *** empty log message ***
31  *
32  * Revision 1.2 2006/12/02 18:53:08 n-ando
33  * Some tests were added.
34  *
35  * Revision 1.1 2006/11/27 08:37:03 n-ando
36  * TestSuites are devided into each directory.
37  *
38  *
39  */
40 
41 #ifndef RingBuffer_cpp
42 #define RingBuffer_cpp
43 
44 #include <cppunit/ui/text/TestRunner.h>
45 #include <cppunit/TextOutputter.h>
46 #include <cppunit/extensions/TestFactoryRegistry.h>
47 #include <cppunit/extensions/HelperMacros.h>
48 #include <cppunit/TestAssert.h>
49 
50 #include <string>
51 #include <sstream>
52 #include <unistd.h>
53 #include <rtm/RingBuffer.h>
54 
55 //#define DEBUG
56 
57 #ifdef __QNX__
58 using std::abort;
59 using std::perror;
60 #endif
61 
62 static const int NLOOP = 0x00000fff; // 読み書きのループ回数typedef ::RTC::BufferStatus::Enum ReturnCode; int isBlockTest = false; ReturnCode g_ret = RTC::BufferStatus::BUFFER_OK; struct thread_arg { thread_arg(RTC::RingBuffer<int>& buff, int loop=NLOOP) : m_buff(buff), m_n_loop(loop) {} RTC::RingBuffer<int>& m_buff; int m_n_loop; }; // 読み込みスレッド void* reader(void* arg) { thread_arg* t_arg = (thread_arg*)arg; RTC::RingBuffer<int>* buff = (RTC::RingBuffer<int>*)&(t_arg->m_buff); ReturnCode ret; for (int i = 0; i < t_arg->m_n_loop; i++) { int output = -1; ret = (*buff).read(output); #if PRINTOUT std::cout << "read() : " << output << std::endl; #endif if (ret == RTC::BufferStatus::TIMEOUT) { g_ret = ret; break; } if (isBlockTest) { if (output != i) { std::cout << "ERROR!!: output=" << output; std::cout << ", correct data=" << i; std::cout << ", return code=" << ret << std::endl; abort(); } } } return NULL; } // 書き込みスレッド void* writer(void* arg) { thread_arg* t_arg = (thread_arg*)arg; RTC::RingBuffer<int>* buff = (RTC::RingBuffer<int>*)&(t_arg->m_buff); for (int i = 0; i < t_arg->m_n_loop; i++) { int input = i; (*buff).write(input); #if PRINTOUT std::cout << "write(" << input << ")" << std::endl; #endif } return NULL; } namespace RingBuffer { /*! * @class RingBufferTests class * @brief RingBuffer test */ class RingBufferTests : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(RingBufferTests); CPPUNIT_TEST(test_length); CPPUNIT_TEST(test_isFull); CPPUNIT_TEST(test_isEmpty); CPPUNIT_TEST(test_init); CPPUNIT_TEST(test_write_read); CPPUNIT_TEST(test_write_read_with_small_length); CPPUNIT_TEST(test_isNew); CPPUNIT_TEST(test_reset); CPPUNIT_TEST(test_wptr_put); CPPUNIT_TEST(test_advanceWptr); CPPUNIT_TEST(test_rptr_get); CPPUNIT_TEST(test_advanceRptr); CPPUNIT_TEST(test_owrite_rback); // full: overwrite, empty: readback, buff length 1,8 CPPUNIT_TEST(test_owrite_dnothing); // full: overwrite, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_owrite_block); // full: overwrite, empty: block, buff length 1,8 CPPUNIT_TEST(test_dnothing_rback); // full: do_nothing, empty: readback, buff length 1,8 CPPUNIT_TEST(test_dnothing_dnothing); // full: do_nothing, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_dnothing_block); // full: do_nothing, empty: block, buff length 1,8 CPPUNIT_TEST(test_block_rback); // full: block, empty: readback, buff length 1,8 CPPUNIT_TEST(test_block_dnothing); // full: block, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_block_block_wr); // full: block, empty: block, buff length 1,8 CPPUNIT_TEST(test_block_block_rw); // full: block, empty: block, read -> write CPPUNIT_TEST_SUITE_END(); private: void do_test(RTC::RingBuffer<int>& buff, int loop=NLOOP, bool read_first=false) { pthread_t tr, tw; thread_arg arg(buff,loop); if (read_first) { // 読み込みスレッドの開始 if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { perror("pthread_create(r)"); return; } // 書き込みスレッドの開始 if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { perror("pthread_create(w)"); return; } } else { // 書き込みスレッドの開始 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tw, NULL , writer, &arg) != 0) { perror("pthread_create(w)"); return; } // 読み込みスレッドの開始 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
63 typedef ::RTC::BufferStatus::Enum ReturnCode;
64 int isBlockTest = false;
66 
67 struct thread_arg
68 {
70  : m_buff(buff), m_n_loop(loop)
71  {}
73  int m_n_loop;
74 };
75 // 読み込みスレッドvoid* reader(void* arg) { thread_arg* t_arg = (thread_arg*)arg; RTC::RingBuffer<int>* buff = (RTC::RingBuffer<int>*)&(t_arg->m_buff); ReturnCode ret; for (int i = 0; i < t_arg->m_n_loop; i++) { int output = -1; ret = (*buff).read(output); #if PRINTOUT std::cout << "read() : " << output << std::endl; #endif if (ret == RTC::BufferStatus::TIMEOUT) { g_ret = ret; break; } if (isBlockTest) { if (output != i) { std::cout << "ERROR!!: output=" << output; std::cout << ", correct data=" << i; std::cout << ", return code=" << ret << std::endl; abort(); } } } return NULL; } // 書き込みスレッド void* writer(void* arg) { thread_arg* t_arg = (thread_arg*)arg; RTC::RingBuffer<int>* buff = (RTC::RingBuffer<int>*)&(t_arg->m_buff); for (int i = 0; i < t_arg->m_n_loop; i++) { int input = i; (*buff).write(input); #if PRINTOUT std::cout << "write(" << input << ")" << std::endl; #endif } return NULL; } namespace RingBuffer { /*! * @class RingBufferTests class * @brief RingBuffer test */ class RingBufferTests : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(RingBufferTests); CPPUNIT_TEST(test_length); CPPUNIT_TEST(test_isFull); CPPUNIT_TEST(test_isEmpty); CPPUNIT_TEST(test_init); CPPUNIT_TEST(test_write_read); CPPUNIT_TEST(test_write_read_with_small_length); CPPUNIT_TEST(test_isNew); CPPUNIT_TEST(test_reset); CPPUNIT_TEST(test_wptr_put); CPPUNIT_TEST(test_advanceWptr); CPPUNIT_TEST(test_rptr_get); CPPUNIT_TEST(test_advanceRptr); CPPUNIT_TEST(test_owrite_rback); // full: overwrite, empty: readback, buff length 1,8 CPPUNIT_TEST(test_owrite_dnothing); // full: overwrite, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_owrite_block); // full: overwrite, empty: block, buff length 1,8 CPPUNIT_TEST(test_dnothing_rback); // full: do_nothing, empty: readback, buff length 1,8 CPPUNIT_TEST(test_dnothing_dnothing); // full: do_nothing, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_dnothing_block); // full: do_nothing, empty: block, buff length 1,8 CPPUNIT_TEST(test_block_rback); // full: block, empty: readback, buff length 1,8 CPPUNIT_TEST(test_block_dnothing); // full: block, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_block_block_wr); // full: block, empty: block, buff length 1,8 CPPUNIT_TEST(test_block_block_rw); // full: block, empty: block, read -> write CPPUNIT_TEST_SUITE_END(); private: void do_test(RTC::RingBuffer<int>& buff, int loop=NLOOP, bool read_first=false) { pthread_t tr, tw; thread_arg arg(buff,loop); if (read_first) { // 読み込みスレッドの開始 if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { perror("pthread_create(r)"); return; } // 書き込みスレッドの開始 if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { perror("pthread_create(w)"); return; } } else { // 書き込みスレッドの開始 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tw, NULL , writer, &arg) != 0) { perror("pthread_create(w)"); return; } // 読み込みスレッドの開始 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
76 void* reader(void* arg)
77 {
78  thread_arg* t_arg = (thread_arg*)arg;
80 
82  for (int i = 0; i < t_arg->m_n_loop; i++) {
83  int output = -1;
84  ret = (*buff).read(output);
85 #if PRINTOUT
86  std::cout << "read() : " << output << std::endl;
87 #endif
88  if (ret == RTC::BufferStatus::TIMEOUT) {
89  g_ret = ret;
90  break;
91  }
92  if (isBlockTest) {
93  if (output != i) {
94  std::cout << "ERROR!!: output=" << output;
95  std::cout << ", correct data=" << i;
96  std::cout << ", return code=" << ret << std::endl;
97  abort();
98  }
99  }
100  }
101  return NULL;
102 }
103 
104 // 書き込みスレッドvoid* writer(void* arg) { thread_arg* t_arg = (thread_arg*)arg; RTC::RingBuffer<int>* buff = (RTC::RingBuffer<int>*)&(t_arg->m_buff); for (int i = 0; i < t_arg->m_n_loop; i++) { int input = i; (*buff).write(input); #if PRINTOUT std::cout << "write(" << input << ")" << std::endl; #endif } return NULL; } namespace RingBuffer { /*! * @class RingBufferTests class * @brief RingBuffer test */ class RingBufferTests : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(RingBufferTests); CPPUNIT_TEST(test_length); CPPUNIT_TEST(test_isFull); CPPUNIT_TEST(test_isEmpty); CPPUNIT_TEST(test_init); CPPUNIT_TEST(test_write_read); CPPUNIT_TEST(test_write_read_with_small_length); CPPUNIT_TEST(test_isNew); CPPUNIT_TEST(test_reset); CPPUNIT_TEST(test_wptr_put); CPPUNIT_TEST(test_advanceWptr); CPPUNIT_TEST(test_rptr_get); CPPUNIT_TEST(test_advanceRptr); CPPUNIT_TEST(test_owrite_rback); // full: overwrite, empty: readback, buff length 1,8 CPPUNIT_TEST(test_owrite_dnothing); // full: overwrite, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_owrite_block); // full: overwrite, empty: block, buff length 1,8 CPPUNIT_TEST(test_dnothing_rback); // full: do_nothing, empty: readback, buff length 1,8 CPPUNIT_TEST(test_dnothing_dnothing); // full: do_nothing, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_dnothing_block); // full: do_nothing, empty: block, buff length 1,8 CPPUNIT_TEST(test_block_rback); // full: block, empty: readback, buff length 1,8 CPPUNIT_TEST(test_block_dnothing); // full: block, empty: do_nothing, buff length 1,8 CPPUNIT_TEST(test_block_block_wr); // full: block, empty: block, buff length 1,8 CPPUNIT_TEST(test_block_block_rw); // full: block, empty: block, read -> write CPPUNIT_TEST_SUITE_END(); private: void do_test(RTC::RingBuffer<int>& buff, int loop=NLOOP, bool read_first=false) { pthread_t tr, tw; thread_arg arg(buff,loop); if (read_first) { // 読み込みスレッドの開始 if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { perror("pthread_create(r)"); return; } // 書き込みスレッドの開始 if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { perror("pthread_create(w)"); return; } } else { // 書き込みスレッドの開始 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tw, NULL , writer, &arg) != 0) { perror("pthread_create(w)"); return; } // 読み込みスレッドの開始 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
105 void* writer(void* arg)
106 {
107  thread_arg* t_arg = (thread_arg*)arg;
109 
110 
111  for (int i = 0; i < t_arg->m_n_loop; i++) {
112  int input = i;
113  (*buff).write(input);
114 #if PRINTOUT
115  std::cout << "write(" << input << ")" << std::endl;
116 #endif
117  }
118  return NULL;
119 }
120 
121 
122 namespace RingBuffer
123 {
129  : public CppUnit::TestFixture
130  {
131  CPPUNIT_TEST_SUITE(RingBufferTests);
132 
133  CPPUNIT_TEST(test_length);
134  CPPUNIT_TEST(test_isFull);
135  CPPUNIT_TEST(test_isEmpty);
136  CPPUNIT_TEST(test_init);
137  CPPUNIT_TEST(test_write_read);
138  CPPUNIT_TEST(test_write_read_with_small_length);
139  CPPUNIT_TEST(test_isNew);
140  CPPUNIT_TEST(test_reset);
141  CPPUNIT_TEST(test_wptr_put);
142  CPPUNIT_TEST(test_advanceWptr);
143  CPPUNIT_TEST(test_rptr_get);
144  CPPUNIT_TEST(test_advanceRptr);
145 
146  CPPUNIT_TEST(test_owrite_rback); // full: overwrite, empty: readback, buff length 1,8
147  CPPUNIT_TEST(test_owrite_dnothing); // full: overwrite, empty: do_nothing, buff length 1,8
148  CPPUNIT_TEST(test_owrite_block); // full: overwrite, empty: block, buff length 1,8
149 
150  CPPUNIT_TEST(test_dnothing_rback); // full: do_nothing, empty: readback, buff length 1,8
151  CPPUNIT_TEST(test_dnothing_dnothing); // full: do_nothing, empty: do_nothing, buff length 1,8
152  CPPUNIT_TEST(test_dnothing_block); // full: do_nothing, empty: block, buff length 1,8
153  CPPUNIT_TEST(test_block_rback); // full: block, empty: readback, buff length 1,8
154  CPPUNIT_TEST(test_block_dnothing); // full: block, empty: do_nothing, buff length 1,8
155  CPPUNIT_TEST(test_block_block_wr); // full: block, empty: block, buff length 1,8
156 
157  CPPUNIT_TEST(test_block_block_rw); // full: block, empty: block, read -> write
158 
159  CPPUNIT_TEST_SUITE_END();
160 
161  private:
162  void do_test(RTC::RingBuffer<int>& buff, int loop=NLOOP, bool read_first=false)
163  {
164  pthread_t tr, tw;
165  thread_arg arg(buff,loop);
166 
167  if (read_first) {
168  // 読み込みスレッドの開始 if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { perror("pthread_create(r)"); return; } // 書き込みスレッドの開始 if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { perror("pthread_create(w)"); return; } } else { // 書き込みスレッドの開始 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tw, NULL , writer, &arg) != 0) { perror("pthread_create(w)"); return; } // 読み込みスレッドの開始 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
169  if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) {
170  perror("pthread_create(r)");
171  return;
172  }
173  // 書き込みスレッドの開始 if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { perror("pthread_create(w)"); return; } } else { // 書き込みスレッドの開始 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tw, NULL , writer, &arg) != 0) { perror("pthread_create(w)"); return; } // 読み込みスレッドの開始 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
174  if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) {
175  perror("pthread_create(w)");
176  return;
177  }
178  }
179  else {
180  // 書き込みスレッドの開始// if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tw, NULL , writer, &arg) != 0) { perror("pthread_create(w)"); return; } // 読み込みスレッドの開始 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
181 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) {
182  if (pthread_create(&tw, NULL , writer, &arg) != 0) {
183  perror("pthread_create(w)");
184  return;
185  }
186  // 読み込みスレッドの開始// if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) { if (pthread_create(&tr, NULL , reader, &arg) != 0) { perror("pthread_create(r)"); return; } } // スレッドの合流 pthread_join(tw, NULL); pthread_join(tr, NULL); } public: /*! * @brief Constructor */ RingBufferTests() { } /*! * @brief Destructor */ ~RingBufferTests() { } /*! * @brief Test initialization */ virtual void setUp() { } /*! * @brief Test finalization */ virtual void tearDown() { } /*! * @brief length()メソッドのテスト * * - コンストラクタで指定されたバッファ長が正しく取得できるか? */ void test_length() { RTC::RingBuffer<int> buff(123); CPPUNIT_ASSERT(buff.length() == 123); size_t len(456); buff.length(len); CPPUNIT_ASSERT(buff.length() == len); } /*! * @brief isEmpty()メソッドのテスト * * - バッファ初期化直後、空ではないと判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされていない場合、 * 空と判定されるか? * - 最後にデータが読み取られた後、新しいデータが書き込みされた場合、 * 空ではないと判定されるか? */ void test_isEmpty() { long int length = 10; RTC::RingBuffer<int> buff(length); // (1) バッファ初期化直後、空ではないと判定されるか? int initialValue = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(initialValue); } CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
187 // if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) {
188  if (pthread_create(&tr, NULL , reader, &arg) != 0) {
189  perror("pthread_create(r)");
190  return;
191  }
192  }
193 
194  // スレッドの合流
195  pthread_join(tw, NULL);
196  pthread_join(tr, NULL);
197  }
198 
199  public:
204  {
205  }
206 
211  {
212  }
213 
217  virtual void setUp()
218  {
219  }
220 
224  virtual void tearDown()
225  {
226  }
227 
233  void test_length()
234  {
235  RTC::RingBuffer<int> buff(123);
236  CPPUNIT_ASSERT(buff.length() == 123);
237 
238  size_t len(456);
239  buff.length(len);
240  CPPUNIT_ASSERT(buff.length() == len);
241  }
242 
253  {
254  long int length = 10;
255  RTC::RingBuffer<int> buff(length);
256 
257  // (1) バッファ初期化直後、空ではないと判定されるか?
258  int initialValue = 12345;
259  for (unsigned int i(0); i < buff.length(); ++i)
260  {
261  buff.write(initialValue);
262  }
263  CPPUNIT_ASSERT_EQUAL(false, buff.empty());
264 
265  // (2) 最後にデータが読み取られた後、新しいデータが書き込みされて // いない場合、空ではないと判定されるか? int readValue; CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた // 場合、空ではないと判定されるか? int writeValue = 98765; CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue)); CPPUNIT_ASSERT_EQUAL(false, buff.empty()); } /*! * @brief isFull()メソッドのテスト * * - バッファが空の場合、フル判定は偽となるか? * - 全バッファにデータが書き込まれている状態で、フル判定は真となるか? * - バッファに幾分データが書き込まれている状態で、フル判定は偽となるか? */ void test_isFull() { // (1) バッファが空の場合、フル判定は偽となるか? int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(false, buff1.full()); // (2) 全バッファにデータが書き込まれている状態で、フル判定は真 // となるか? int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i); } CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽 // となるか? int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i); } CPPUNIT_ASSERT_EQUAL(false, buff3.full()); } /*! * @brief init()メソッドのテスト * * - あらかじめデータで初期化した後、設定したデータを正しく読み出せるか? */ void test_init() { // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
266  // いない場合、空ではないと判定されるか?
267  int readValue;
268  CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue));
269  CPPUNIT_ASSERT_EQUAL(false, buff.empty());
270 
271  // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた
272  // 場合、空ではないと判定されるか?
273  int writeValue = 98765;
274  CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue));
275  CPPUNIT_ASSERT_EQUAL(false, buff.empty());
276  }
277 
278 
286  void test_isFull()
287  {
288  // (1) バッファが空の場合、フル判定は偽となるか?
289  int length1 = 10;
290  RTC::RingBuffer<int> buff1(length1);
291  CPPUNIT_ASSERT_EQUAL(false, buff1.full());
292 
293  // (2) 全バッファにデータが書き込まれている状態で、フル判定は真
294  // となるか?
295  int length2 = 10;
296  RTC::RingBuffer<int> buff2(length2);
297  for (int i = 0; i < length2; i++) {
298  buff2.write(i);
299  }
300  CPPUNIT_ASSERT_EQUAL(true, buff2.full());
301 
302  // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽
303  // となるか?
304  int length3 = 10;
305  RTC::RingBuffer<int> buff3(length3);
306  for (int i = 0; i < length3 / 2; i++) {
307  buff3.write(i);
308  }
309  CPPUNIT_ASSERT_EQUAL(false, buff3.full());
310  }
311 
317  void test_init()
318  {
319  // バッファを作成して、init()で初期化する long int length = 10; RTC::RingBuffer<int> buff(length); int value = 12345; for (unsigned int i(0); i < buff.length(); ++i) { buff.write(value); } // 設定したデータを正しく読み出せるか? int expected = 12345; for (long int i = 0; i < length; i++) { int actual; buff.read(actual); CPPUNIT_ASSERT_EQUAL(expected, actual); } } /*! * @brief write()メソッドおよびread()メソッドのテスト * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - 全バッファに幾分データが書き込まれている状態で1データ書込・読出を * 行い、書き込んだデータを正しく読み出せるか? */ void test_write_read() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
320  long int length = 10;
321  RTC::RingBuffer<int> buff(length);
322 
323  int value = 12345;
324  for (unsigned int i(0); i < buff.length(); ++i)
325  {
326  buff.write(value);
327  }
328 
329  // 設定したデータを正しく読み出せるか?
330  int expected = 12345;
331  for (long int i = 0; i < length; i++) {
332  int actual;
333  buff.read(actual);
334  CPPUNIT_ASSERT_EQUAL(expected, actual);
335  }
336  }
337 
349  {
350  // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ
351  // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 3; RTC::RingBuffer<int> buff1(length1); coil::Properties prop; prop["write.full_policy"] = "block"; prop["write.timeout"] = "5.0"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "5.0"; buff1.init(prop); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
352  long int length1 = 3;
353  RTC::RingBuffer<int> buff1(length1);
355  prop["write.full_policy"] = "block";
356  prop["write.timeout"] = "5.0";
357  prop["read.empty_policy"] = "block";
358  prop["read.timeout"] = "5.0";
359 
360  buff1.init(prop);
361  // 1データ書込・読出を行う
362  for (int writeValue = 0; writeValue < 100; writeValue++) {
363  // 書込み if (buff1.full()) { std::cout << "### FULL ###" << std::endl; int readValue; if (writeValue % 5 == 0) { while (!buff1.empty()) { std::cout << "read timeout: " << 5 << std::endl; buff1.read(readValue, 5); std::cout << "read: " << readValue << std::endl; } std::cout << "read timeout: " << 5 << std::endl; std::cout << "waiting 5 sec" << std::endl; std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl; std::cout << "read: " << readValue << std::endl; } else { buff1.read(readValue); std::cout << "read: " << readValue << std::endl; } if (buff1.full()) { std::cout << "??? still full" << std::endl; } else { std::cout << "buffer full was blown over." << std::endl; } } if (buff1.empty()) { std::cout << "### EMPTY ###" << std::endl; } // std::cout << "timeout-> " << writeValue << std::endl; std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl; // std::cout << "readable " << buff1.readable() << std::endl; // std::cout << "writable " << buff1.writable() << std::endl; // 読出し int readValue; buff1.get(readValue); std::cout << writeValue << " == " << readValue << std::endl; // buff1.read(readValue) // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue, readValue); sleep(1); } return; // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
364  if (buff1.full())
365  {
366  std::cout << "### FULL ###" << std::endl;
367  int readValue;
368 
369  if (writeValue % 5 == 0)
370  {
371  while (!buff1.empty())
372  {
373  std::cout << "read timeout: " << 5 << std::endl;
374  buff1.read(readValue, 5);
375  std::cout << "read: " << readValue << std::endl;
376  }
377  std::cout << "read timeout: " << 5 << std::endl;
378  std::cout << "waiting 5 sec" << std::endl;
379  std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl;
380  std::cout << "read: " << readValue << std::endl;
381  }
382  else
383  {
384  buff1.read(readValue);
385  std::cout << "read: " << readValue << std::endl;
386  }
387 
388  if (buff1.full())
389  {
390  std::cout << "??? still full" << std::endl;
391  }
392  else
393  {
394  std::cout << "buffer full was blown over." << std::endl;
395  }
396  }
397  if (buff1.empty())
398  {
399  std::cout << "### EMPTY ###" << std::endl;
400  }
401 
402  // std::cout << "timeout-> " << writeValue << std::endl;
403  std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl;
404 
405  // std::cout << "readable " << buff1.readable() << std::endl;
406  // std::cout << "writable " << buff1.writable() << std::endl;
407 
408  // 読出し
409  int readValue;
410  buff1.get(readValue);
411 
412  std::cout << writeValue << " == " << readValue << std::endl;
413 
414  // buff1.read(readValue)
415  // 書き込んだデータを正しく読み出せたか?
416  // CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
417  sleep(1);
418  }
419  return;
420  // (2) 全バッファにデータが書き込まれている状態で1データ書込・読
421  // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、
422  // フル状態にする long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
423  long int length2 = 10;
424  RTC::RingBuffer<int> buff2(length2);
425  for (int i = 0; i < length2; i++) {
426  buff2.write(i + 123);
427  }
428 
429  // 1データ書込・読出を行う
430  for (int writeValue = 0; writeValue < 100; writeValue++) {
431  // 書込み buff2.write(writeValue); // 読出し int readValue; buff2.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (3) バッファに幾分データが書き込まれている状態で1データ書込・ // 読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 123); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
432  buff2.write(writeValue);
433 
434  // 読出し
435  int readValue;
436  buff2.read(readValue);
437 
438  // 書き込んだデータを正しく読み出せたか?
439  CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
440  }
441 
442  // (3) バッファに幾分データが書き込まれている状態で1データ書込・
443  // 読出を行い、書き込んだデータを正しく読み出せるか?
444  long int length3 = 10;
445  RTC::RingBuffer<int> buff3(length3);
446  for (int i = 0; i < length3 / 2; i++) {
447  buff3.write(i + 123);
448  }
449 
450  // 1データ書込・読出を行う
451  for (int writeValue = 0; writeValue < 100; writeValue++) {
452  // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } } /*! * @brief write()メソッドおよびread()メソッドのテスト(バッファ長2の場合) * * - バッファ空状態で1データ書込・読出を行い、書き込んだデータを正しく * 読み出せるか? * - 全バッファにデータが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? * - バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、 * 書き込んだデータを正しく読み出せるか? */ void test_write_read_with_small_length() { // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
453  buff3.write(writeValue);
454 
455  // 読出し
456  int readValue;
457  buff3.read(readValue);
458 
459  // 書き込んだデータを正しく読み出せたか?
460  CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
461  }
462  }
463 
475  {
476  // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ
477  // を正しく読み出せるか?バッファ作成し、空のままにする long int length1 = 2; RTC::RingBuffer<int> buff1(length1); // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
478  long int length1 = 2;
479  RTC::RingBuffer<int> buff1(length1);
480 
481  // 1データ書込・読出を行う
482  for (int writeValue = 0; writeValue < 100; writeValue++) {
483  // 書込み buff1.write(writeValue); // 読出し int readValue; buff1.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue, readValue); } // (2) 全バッファにデータが書き込まれている状態で1データ書込・読 // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、 // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
484  buff1.write(writeValue);
485 
486  // 読出し
487  int readValue;
488  buff1.read(readValue);
489 
490  // 書き込んだデータを正しく読み出せたか?
491  CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
492  }
493 
494  // (2) 全バッファにデータが書き込まれている状態で1データ書込・読
495  // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、
496  // フル状態にする long int length2 = 2; RTC::RingBuffer<int> buff2(length2); coil::Properties prop; prop["write.full_policy"] = "overwrite"; buff2.init(prop); for (int i = 0; i < length2; i++) { buff2.write(i + 123); } // 1データ書込・読出を行う // for (int writeValue = 0; writeValue < 100; writeValue++) { // // 書込み // buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
497  long int length2 = 2;
498  RTC::RingBuffer<int> buff2(length2);
500  prop["write.full_policy"] = "overwrite";
501  buff2.init(prop);
502 
503  for (int i = 0; i < length2; i++) {
504  buff2.write(i + 123);
505  }
506 
507  // 1データ書込・読出を行う
508 // for (int writeValue = 0; writeValue < 100; writeValue++) {
509 // // 書込み// buff2.write(writeValue); // // // 読出し // int readValue; // buff2.read(readValue); // // // 書き込んだデータを正しく読み出せたか? // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue); // } // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
510 // buff2.write(writeValue);
511 //
512 // // 読出し
513 // int readValue;
514 // buff2.read(readValue);
515 //
516 // // 書き込んだデータを正しく読み出せたか?
517 // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue);
518 // }
519 
520  // 書込み /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/ buff2.write(0); CPPUNIT_ASSERT_EQUAL(true, buff2.full()); // 読出し int readValue; /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */ buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff2.full()); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(1+123, readValue); // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか? long int length3 = 2; RTC::RingBuffer<int> buff3(length3); coil::Properties prop3; prop3["write.full_policy"] = "overwrite"; buff3.init(prop3); for (int i = 0; i < 1; i++) { buff3.write(i + 123); } { // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
521  /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/
522  buff2.write(0);
523 
524  CPPUNIT_ASSERT_EQUAL(true, buff2.full());
525  // 読出し
526  int readValue;
527  /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */
528  buff2.read(readValue);
529 
530  CPPUNIT_ASSERT_EQUAL(false, buff2.full());
531  // 書き込んだデータを正しく読み出せたか?
532  CPPUNIT_ASSERT_EQUAL(1+123, readValue);
533 
534  // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか?
535  long int length3 = 2;
536  RTC::RingBuffer<int> buff3(length3);
537  coil::Properties prop3;
538  prop3["write.full_policy"] = "overwrite";
539  buff3.init(prop3);
540 
541  for (int i = 0; i < 1; i++) {
542  buff3.write(i + 123);
543  }
544  {
545  // 書込み buff3.write(-1); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(123, readValue); } // 1データ書込・読出を行う for (int writeValue = 0; writeValue < 100; writeValue++) { // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
546  buff3.write(-1);
547 
548  // 読出し
549  int readValue;
550  buff3.read(readValue);
551 
552  // 書き込んだデータを正しく読み出せたか?
553  CPPUNIT_ASSERT_EQUAL(123, readValue);
554  }
555  // 1データ書込・読出を行う
556  for (int writeValue = 0; writeValue < 100; writeValue++) {
557  // 書込み buff3.write(writeValue); // 読出し int readValue; buff3.read(readValue); // 書き込んだデータを正しく読み出せたか? CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue); } } /*! * @brief isNew()メソッドのテスト * * - バッファが空の状態で、isNew判定が偽になるか? * - 全バッファにデータが書き込まれている状態で、 * データ書込後のisNew判定が真になるか? * - 全バッファにデータが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? * - バッファに幾分データが書き込まれている状態で、データ書込後のisNew * 判定が真になるか? * - バッファに幾分データが書き込まれている状態で、データ書込し、 * そのデータ読出を行った後のisNew判定が偽になるか? */ void test_isNew() { // (1) バッファが空の状態で、isNew判定が偽になるか? long int length1 = 10; RTC::RingBuffer<int> buff1(length1); CPPUNIT_ASSERT_EQUAL(true, buff1.empty()); // 全バッファにデータが書き込まれている状態で... long int length2 = 10; RTC::RingBuffer<int> buff2(length2); for (int i = 0; i < length2; i++) { // (2) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff2.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff2.empty()); // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff2.read(readValue); CPPUNIT_ASSERT_EQUAL(true, buff2.empty()); } // バッファに幾分データが書き込まれている状態で... long int length3 = 10; RTC::RingBuffer<int> buff3(length3); for (int i = 0; i < length3 / 2; i++) { buff3.write(i + 456); } for (int i = 0; i < length3; i++) { // (4) ...データ書込後のisNew判定が真になるか? int writeValue = i + 123; buff3.write(writeValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽 // になるか? int readValue; buff3.read(readValue); CPPUNIT_ASSERT_EQUAL(false, buff3.empty()); } } /*! * @brief reset()メソッドのテスト * */ void test_reset() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<8;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.advanceRptr(3); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5); buff.reset(); CPPUNIT_ASSERT(buff.empty()); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]); buff.put(idata[9]); CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]); CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0); } /*! * @brief wptr(),put()メソッドのテスト * */ void test_wptr_put() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic)); } buff.advanceWptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic)); } } /*! * @brief advanceWptr()メソッドのテスト * */ void test_advanceWptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK); buff.advanceRptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable()); CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable()); } /*! * @brief rptr(),get()メソッドのテスト * */ void test_rptr_get() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } buff.reset(); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic)); } buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic)); } for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic)); } buff.reset(); buff.advanceWptr(10); for(int ic(0);ic<10;++ic) { CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get()); int ret; buff.get(ret); CPPUNIT_ASSERT_EQUAL(idata[ic],ret); buff.advanceRptr(); } } /*! * @brief advanceRptr()メソッドのテスト * */ void test_advanceRptr() { int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890}; RTC::RingBuffer<int> buff(10); buff.advanceWptr(5); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); buff.reset(); buff.advanceWptr(5); buff.advanceRptr(5); for(int ic(0);ic<10;++ic) { buff.put(idata[ic]); buff.advanceWptr(); } CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable()); CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK); CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr()); CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable()); } /* * デッドロックの検証1 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: readback * */ void test_owrite_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証2 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: do_nothing * */ void test_owrite_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証3 * * バッファサイズ: 1, 8 * write.full_policy: overwrite * read.empty_policy: block * read.timeout: 3.0 * */ void test_owrite_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "overwrite"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "3.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証4 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: readback * */ void test_dnothing_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "readback"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証5 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: do_nothing * */ void test_dnothing_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "do_nothing"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証6 * * バッファサイズ: 1, 8 * write.full_policy: do_nothing * read.empty_policy: block * read.timeout: 1.0 * */ void test_dnothing_block() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "do_nothing"; prop["read.empty_policy"] = "block"; prop["read.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証7 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: readback * write.timeout: 1.0 * */ void test_block_rback() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "readback"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証8 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: do_nothing * write.timeout: 1.0 * */ void test_block_dnothing() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "do_nothing"; prop["write.timeout"] = "1.0"; buff.init(prop); g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,100); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; std::cout << std::flush; return; } /* * デッドロックの検証9 * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_wr() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } /* * デッドロックの検証10 read -> write * * バッファサイズ: 1, 8 * write.full_policy: block * read.empty_policy: block * write.timeout: 3.0 * read.timeout: 3.0 * */ void test_block_block_rw() { RTC::RingBuffer<int> buff(1); // デフォルト設定以外のバッファ coil::Properties prop; prop["write.full_policy"] = "block"; prop["read.empty_policy"] = "block"; prop["write.timeout"] = "3.0"; prop["read.timeout"] = "3.0"; buff.init(prop); isBlockTest = true; g_ret = RTC::BufferStatus::BUFFER_OK; do_test(buff,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; RTC::RingBuffer<int> buff2(8); buff2.init(prop); do_test(buff2,true); CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK); g_ret = RTC::BufferStatus::BUFFER_OK; isBlockTest = false; std::cout << std::flush; return; } }; }; // namespace RingBuffer /* * Register test suite */ CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests); #ifdef LOCAL_MAIN int main(int argc, char* argv[]) { FORMAT format = TEXT_OUT; int target = 0; std::string xsl; std::string ns; std::string fname; std::ofstream ofs; int i(1); while (i < argc) { std::string arg(argv[i]); std::string next_arg; if (i + 1 < argc) next_arg = argv[i + 1]; else next_arg = ""; if (arg == "--text") { format = TEXT_OUT; break; } if (arg == "--xml") { if (next_arg == "") { fname = argv[0]; fname += ".xml"; } else { fname = next_arg; } format = XML_OUT; ofs.open(fname.c_str()); } if ( arg == "--compiler" ) { format = COMPILER_OUT; break; } if ( arg == "--cerr" ) { target = 1; break; } if ( arg == "--xsl" ) { if (next_arg == "") xsl = "default.xsl"; else xsl = next_arg; } if ( arg == "--namespace" ) { if (next_arg == "") { std::cerr << "no namespace specified" << std::endl; exit(1); } else { xsl = next_arg; } } ++i; } CppUnit::TextUi::TestRunner runner; if ( ns.empty() ) runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest()); else runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest()); CppUnit::Outputter* outputter = 0; std::ostream* stream = target ? &std::cerr : &std::cout; switch ( format ) { case TEXT_OUT : outputter = new CppUnit::TextOutputter(&runner.result(),*stream); break; case XML_OUT : std::cout << "XML_OUT" << std::endl; outputter = new CppUnit::XmlOutputter(&runner.result(), ofs, "shift_jis"); static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl); break; case COMPILER_OUT : outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream); break; } runner.setOutputter(outputter); runner.run(); return 0; // runner.run() ? 0 : 1; } #endif // MAIN #endif // RingBuffer_cpp
558  buff3.write(writeValue);
559 
560  // 読出し
561  int readValue;
562  buff3.read(readValue);
563 
564  // 書き込んだデータを正しく読み出せたか?
565  CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue);
566  }
567  }
568 
582  void test_isNew()
583  {
584  // (1) バッファが空の状態で、isNew判定が偽になるか?
585  long int length1 = 10;
586  RTC::RingBuffer<int> buff1(length1);
587  CPPUNIT_ASSERT_EQUAL(true, buff1.empty());
588 
589  // 全バッファにデータが書き込まれている状態で...
590  long int length2 = 10;
591  RTC::RingBuffer<int> buff2(length2);
592 
593  for (int i = 0; i < length2; i++) {
594  // (2) ...データ書込後のisNew判定が真になるか?
595  int writeValue = i + 123;
596  buff2.write(writeValue);
597  CPPUNIT_ASSERT_EQUAL(false, buff2.empty());
598 
599  // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽
600  // になるか?
601  int readValue;
602  buff2.read(readValue);
603  CPPUNIT_ASSERT_EQUAL(true, buff2.empty());
604  }
605 
606  // バッファに幾分データが書き込まれている状態で...
607  long int length3 = 10;
608  RTC::RingBuffer<int> buff3(length3);
609  for (int i = 0; i < length3 / 2; i++) {
610  buff3.write(i + 456);
611  }
612 
613  for (int i = 0; i < length3; i++) {
614  // (4) ...データ書込後のisNew判定が真になるか?
615  int writeValue = i + 123;
616  buff3.write(writeValue);
617  CPPUNIT_ASSERT_EQUAL(false, buff3.empty());
618 
619  // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽
620  // になるか?
621  int readValue;
622  buff3.read(readValue);
623  CPPUNIT_ASSERT_EQUAL(false, buff3.empty());
624  }
625  }
630  void test_reset()
631  {
632  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
633  RTC::RingBuffer<int> buff(10);
634 
635  for(int ic(0);ic<8;++ic)
636  {
637  buff.put(idata[ic]);
638  buff.advanceWptr();
639  }
640  buff.advanceRptr(3);
641  CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]);
642  CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5);
643 
644  buff.reset();
645  CPPUNIT_ASSERT(buff.empty());
646  CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]);
647  buff.put(idata[9]);
648  CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]);
649  CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0);
650 
651  }
657  {
658  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
659  RTC::RingBuffer<int> buff(10);
660  for(int ic(0);ic<10;++ic)
661  {
662  buff.put(idata[ic]);
663  buff.advanceWptr();
664  }
665  buff.reset();
666  for(int ic(0);ic<10;++ic)
667  {
668  CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic));
669  }
670  for(int ic(0);ic<10;++ic)
671  {
672  CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic));
673  }
674  buff.advanceWptr(5);
675  for(int ic(0);ic<10;++ic)
676  {
677  CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic));
678  }
679  for(int ic(0);ic<10;++ic)
680  {
681  CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic));
682  }
683 
684  }
690  {
691  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
692  RTC::RingBuffer<int> buff(10);
693  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET);
694  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK);
695  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET);
696  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK);
697  buff.reset();
698  for(int ic(0);ic<10;++ic)
699  {
700  buff.put(idata[ic]);
701  buff.advanceWptr();
702  }
703  buff.reset();
704  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK);
705  buff.advanceRptr(5);
706  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET);
707  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK);
708  CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr());
709  CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable());
710  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK);
711  CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr());
712  CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable());
713  }
719  {
720  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
721  RTC::RingBuffer<int> buff(10);
722  for(int ic(0);ic<10;++ic)
723  {
724  buff.put(idata[ic]);
725  buff.advanceWptr();
726  }
727  buff.reset();
728  for(int ic(0);ic<10;++ic)
729  {
730  CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic));
731  }
732  for(int ic(0);ic<10;++ic)
733  {
734  CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic));
735  }
736  buff.advanceWptr(5);
737  buff.advanceRptr(5);
738  for(int ic(0);ic<10;++ic)
739  {
740  CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic));
741  }
742  for(int ic(0);ic<10;++ic)
743  {
744  CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic));
745  }
746  buff.reset();
747  buff.advanceWptr(10);
748  for(int ic(0);ic<10;++ic)
749  {
750  CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get());
751  int ret;
752  buff.get(ret);
753  CPPUNIT_ASSERT_EQUAL(idata[ic],ret);
754  buff.advanceRptr();
755  }
756  }
762  {
763  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
764  RTC::RingBuffer<int> buff(10);
765  buff.advanceWptr(5);
766  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET);
767  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK);
768  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET);
769  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK);
770  buff.reset();
771  buff.advanceWptr(5);
772  buff.advanceRptr(5);
773  for(int ic(0);ic<10;++ic)
774  {
775  buff.put(idata[ic]);
776  buff.advanceWptr();
777  }
778  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET);
779  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK);
780  CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr());
781  CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable());
782  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK);
783  CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr());
784  CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable());
785  }
786 
787  /*
788  * デッドロックの検証1
789  *
790  * バッファサイズ: 1, 8
791  * write.full_policy: overwrite
792  * read.empty_policy: readback
793  *
794  */
796  {
797  RTC::RingBuffer<int> buff(1);
798 
799  // デフォルト設定以外のバッファ
801  prop["write.full_policy"] = "overwrite";
802  prop["read.empty_policy"] = "readback";
803  buff.init(prop);
804 
806  do_test(buff);
807 
808  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
810 
811  RTC::RingBuffer<int> buff2(8);
812  buff2.init(prop);
813 
814  do_test(buff2);
815  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
817 
818  std::cout << std::flush;
819  return;
820  }
821 
822 
823  /*
824  * デッドロックの検証2
825  *
826  * バッファサイズ: 1, 8
827  * write.full_policy: overwrite
828  * read.empty_policy: do_nothing
829  *
830  */
832  {
833  RTC::RingBuffer<int> buff(1);
834 
835  // デフォルト設定以外のバッファ
837  prop["write.full_policy"] = "overwrite";
838  prop["read.empty_policy"] = "do_nothing";
839  buff.init(prop);
840 
842  do_test(buff);
843  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
845 
846 
847  RTC::RingBuffer<int> buff2(8);
848  buff2.init(prop);
849 
850  do_test(buff2);
851  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
853 
854  std::cout << std::flush;
855  return;
856  }
857 
858 
859  /*
860  * デッドロックの検証3
861  *
862  * バッファサイズ: 1, 8
863  * write.full_policy: overwrite
864  * read.empty_policy: block
865  * read.timeout: 3.0
866  *
867  */
869  {
870  RTC::RingBuffer<int> buff(1);
871 
872  // デフォルト設定以外のバッファ
874  prop["write.full_policy"] = "overwrite";
875  prop["read.empty_policy"] = "block";
876  prop["read.timeout"] = "3.0";
877  buff.init(prop);
878 
880  do_test(buff);
881  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
883 
884 
885  RTC::RingBuffer<int> buff2(8);
886  buff2.init(prop);
887  do_test(buff2);
888  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
890 
891 
892  std::cout << std::flush;
893  return;
894  }
895 
896 
897  /*
898  * デッドロックの検証4
899  *
900  * バッファサイズ: 1, 8
901  * write.full_policy: do_nothing
902  * read.empty_policy: readback
903  *
904  */
906  {
907  RTC::RingBuffer<int> buff(1);
908 
909  // デフォルト設定以外のバッファ
911  prop["write.full_policy"] = "do_nothing";
912  prop["read.empty_policy"] = "readback";
913  buff.init(prop);
914 
916  do_test(buff);
917  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
919 
920 
921  RTC::RingBuffer<int> buff2(8);
922  buff2.init(prop);
923  do_test(buff2);
924  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
926 
927 
928  std::cout << std::flush;
929  return;
930  }
931 
932 
933  /*
934  * デッドロックの検証5
935  *
936  * バッファサイズ: 1, 8
937  * write.full_policy: do_nothing
938  * read.empty_policy: do_nothing
939  *
940  */
942  {
943  RTC::RingBuffer<int> buff(1);
944 
945  // デフォルト設定以外のバッファ
947  prop["write.full_policy"] = "do_nothing";
948  prop["read.empty_policy"] = "do_nothing";
949  buff.init(prop);
950 
952  do_test(buff);
953  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
955 
956 
957  RTC::RingBuffer<int> buff2(8);
958  buff2.init(prop);
959  do_test(buff2);
960  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
962 
963 
964  std::cout << std::flush;
965  return;
966  }
967 
968 
969  /*
970  * デッドロックの検証6
971  *
972  * バッファサイズ: 1, 8
973  * write.full_policy: do_nothing
974  * read.empty_policy: block
975  * read.timeout: 1.0
976  *
977  */
979  {
980  RTC::RingBuffer<int> buff(1);
981 
982  // デフォルト設定以外のバッファ
984  prop["write.full_policy"] = "do_nothing";
985  prop["read.empty_policy"] = "block";
986  prop["read.timeout"] = "1.0";
987  buff.init(prop);
988 
990  do_test(buff);
991  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
993 
994 
995  RTC::RingBuffer<int> buff2(8);
996  buff2.init(prop);
997  do_test(buff2);
998  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1000 
1001 
1002  std::cout << std::flush;
1003  return;
1004  }
1005 
1006 
1007  /*
1008  * デッドロックの検証7
1009  *
1010  * バッファサイズ: 1, 8
1011  * write.full_policy: block
1012  * read.empty_policy: readback
1013  * write.timeout: 1.0
1014  *
1015  */
1017  {
1018  RTC::RingBuffer<int> buff(1);
1019 
1020  // デフォルト設定以外のバッファ
1022  prop["write.full_policy"] = "block";
1023  prop["read.empty_policy"] = "readback";
1024  prop["write.timeout"] = "1.0";
1025  buff.init(prop);
1026 
1028  do_test(buff,100);
1029  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1031 
1032 
1033  RTC::RingBuffer<int> buff2(8);
1034  buff2.init(prop);
1035  do_test(buff2,100);
1036  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1038 
1039 
1040  std::cout << std::flush;
1041  return;
1042  }
1043 
1044 
1045  /*
1046  * デッドロックの検証8
1047  *
1048  * バッファサイズ: 1, 8
1049  * write.full_policy: block
1050  * read.empty_policy: do_nothing
1051  * write.timeout: 1.0
1052  *
1053  */
1055  {
1056  RTC::RingBuffer<int> buff(1);
1057 
1058  // デフォルト設定以外のバッファ
1060  prop["write.full_policy"] = "block";
1061  prop["read.empty_policy"] = "do_nothing";
1062  prop["write.timeout"] = "1.0";
1063  buff.init(prop);
1064 
1066  do_test(buff,100);
1067  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1069 
1070 
1071  RTC::RingBuffer<int> buff2(8);
1072  buff2.init(prop);
1073  do_test(buff2,100);
1074  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1076 
1077 
1078  std::cout << std::flush;
1079  return;
1080  }
1081 
1082 
1083  /*
1084  * デッドロックの検証9
1085  *
1086  * バッファサイズ: 1, 8
1087  * write.full_policy: block
1088  * read.empty_policy: block
1089  * write.timeout: 3.0
1090  * read.timeout: 3.0
1091  *
1092  */
1094  {
1095  RTC::RingBuffer<int> buff(1);
1096 
1097  // デフォルト設定以外のバッファ
1099  prop["write.full_policy"] = "block";
1100  prop["read.empty_policy"] = "block";
1101  prop["write.timeout"] = "3.0";
1102  prop["read.timeout"] = "3.0";
1103  buff.init(prop);
1104 
1105  isBlockTest = true;
1107  do_test(buff);
1108  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1110 
1111 
1112  RTC::RingBuffer<int> buff2(8);
1113  buff2.init(prop);
1114  do_test(buff2);
1115  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1117 
1118 
1119  isBlockTest = false;
1120  std::cout << std::flush;
1121  return;
1122  }
1123 
1124 
1125  /*
1126  * デッドロックの検証10 read -> write
1127  *
1128  * バッファサイズ: 1, 8
1129  * write.full_policy: block
1130  * read.empty_policy: block
1131  * write.timeout: 3.0
1132  * read.timeout: 3.0
1133  *
1134  */
1136  {
1137  RTC::RingBuffer<int> buff(1);
1138 
1139  // デフォルト設定以外のバッファ
1141  prop["write.full_policy"] = "block";
1142  prop["read.empty_policy"] = "block";
1143  prop["write.timeout"] = "3.0";
1144  prop["read.timeout"] = "3.0";
1145  buff.init(prop);
1146 
1147  isBlockTest = true;
1149  do_test(buff,true);
1150  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1152 
1153 
1154  RTC::RingBuffer<int> buff2(8);
1155  buff2.init(prop);
1156  do_test(buff2,true);
1157  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1159 
1160 
1161  isBlockTest = false;
1162  std::cout << std::flush;
1163  return;
1164  }
1165 
1166 
1167 
1168  };
1169 }; // namespace RingBuffer
1170 
1171 /*
1172  * Register test suite
1173  */
1175 
1176 #ifdef LOCAL_MAIN
1177 int main(int argc, char* argv[])
1178 {
1179 
1180  FORMAT format = TEXT_OUT;
1181  int target = 0;
1182  std::string xsl;
1183  std::string ns;
1184  std::string fname;
1185  std::ofstream ofs;
1186 
1187  int i(1);
1188  while (i < argc)
1189  {
1190  std::string arg(argv[i]);
1191  std::string next_arg;
1192  if (i + 1 < argc) next_arg = argv[i + 1];
1193  else next_arg = "";
1194 
1195  if (arg == "--text") { format = TEXT_OUT; break; }
1196  if (arg == "--xml")
1197  {
1198  if (next_arg == "")
1199  {
1200  fname = argv[0];
1201  fname += ".xml";
1202  }
1203  else
1204  {
1205  fname = next_arg;
1206  }
1207  format = XML_OUT;
1208  ofs.open(fname.c_str());
1209  }
1210  if ( arg == "--compiler" ) { format = COMPILER_OUT; break; }
1211  if ( arg == "--cerr" ) { target = 1; break; }
1212  if ( arg == "--xsl" )
1213  {
1214  if (next_arg == "") xsl = "default.xsl";
1215  else xsl = next_arg;
1216  }
1217  if ( arg == "--namespace" )
1218  {
1219  if (next_arg == "")
1220  {
1221  std::cerr << "no namespace specified" << std::endl;
1222  exit(1);
1223  }
1224  else
1225  {
1226  xsl = next_arg;
1227  }
1228  }
1229  ++i;
1230  }
1231  CppUnit::TextUi::TestRunner runner;
1232  if ( ns.empty() )
1233  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
1234  else
1235  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest());
1236  CppUnit::Outputter* outputter = 0;
1237  std::ostream* stream = target ? &std::cerr : &std::cout;
1238  switch ( format )
1239  {
1240  case TEXT_OUT :
1241  outputter = new CppUnit::TextOutputter(&runner.result(),*stream);
1242  break;
1243  case XML_OUT :
1244  std::cout << "XML_OUT" << std::endl;
1245  outputter = new CppUnit::XmlOutputter(&runner.result(),
1246  ofs, "shift_jis");
1247  static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl);
1248  break;
1249  case COMPILER_OUT :
1250  outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream);
1251  break;
1252  }
1253  runner.setOutputter(outputter);
1254  runner.run();
1255  return 0; // runner.run() ? 0 : 1;
1256 }
1257 #endif // MAIN
1258 #endif // RingBuffer_cpp
void test_advanceWptr()
advanceWptr()メソッドのテスト
int main(int argc, char **argv)
void test_rptr_get()
rptr(),get()メソッドのテスト
Defautl Buffer class.
virtual DataType * rptr(long int n=0)
Get the buffer length.
Definition: RingBuffer.h:567
void test_advanceRptr()
advanceRptr()メソッドのテスト
CPPUNIT_TEST_SUITE_REGISTRATION(RingBuffer::RingBufferTests)
virtual ReturnCode read(DataType &value, long int sec=-1, long int nsec=0)
Readout data from the buffer.
Definition: RingBuffer.h:711
unsigned int sleep(unsigned int seconds)
Stop a processing at specified second time.
Definition: ace/coil/Time.h:40
void * reader(void *arg)
virtual bool full(void) const
Check on whether the buffer is full.
Definition: RingBuffer.h:540
void test_isFull()
isFull()メソッドのテスト
RTC::ReturnCode_t ret(RTC::Local::ReturnCode_t r)
virtual void tearDown()
Test finalization.
static const char * toString(Enum status)
Convert BufferStatus into the string.
Definition: BufferStatus.h:118
RTC::RingBuffer< int > & m_buff
virtual void init(const coil::Properties &prop)
Set the buffer.
Definition: RingBuffer.h:187
virtual DataType * wptr(long int n=0)
Get the buffer length.
Definition: RingBuffer.h:305
Enum
DataPortStatus return codes.
Definition: BufferStatus.h:84
static const int NLOOP
virtual ReturnCode reset()
Get the buffer length.
Definition: RingBuffer.h:272
thread_arg(RTC::RingBuffer< int > &buff, int loop=NLOOP)
ReturnCode g_ret
void do_test(RTC::RingBuffer< int > &buff, int loop=NLOOP, bool read_first=false)
virtual ReturnCode advanceWptr(long int n=1)
Get the buffer length.
Definition: RingBuffer.h:334
virtual bool empty(void) const
Check on whether the buffer is empty.
Definition: RingBuffer.h:829
virtual size_t writable() const
Write data into the buffer.
Definition: RingBuffer.h:515
virtual size_t readable() const
Write data into the buffer.
Definition: RingBuffer.h:804
void test_length()
length()メソッドのテスト
virtual ReturnCode write(const DataType &value, long int sec=-1, long int nsec=0)
Write data into the buffer.
Definition: RingBuffer.h:430
::RTC::BufferStatus::Enum ReturnCode
prop
Organization::get_organization_property ();.
virtual ReturnCode advanceRptr(long int n=1)
Get the buffer length.
Definition: RingBuffer.h:594
void test_write_read_with_small_length()
write()メソッドおよびread()メソッドのテスト(バッファ長2の場合)
void test_init()
init()メソッドのテスト
int isBlockTest
Class represents a set of properties.
Definition: Properties.h:101
void test_reset()
reset()メソッドのテスト
virtual ReturnCode get(DataType &value)
Write data into the buffer.
Definition: RingBuffer.h:638
virtual void setUp()
Test initialization.
virtual ReturnCode put(const DataType &value)
Write data into the buffer.
Definition: RingBuffer.h:382
void test_isEmpty()
isEmpty()メソッドのテスト
void test_wptr_put()
wptr(),put()メソッドのテスト
void * writer(void *arg)
BufferBase abstract class.
Definition: BufferBase.h:104
void test_isNew()
isNew()メソッドのテスト
virtual size_t length(void) const
Get the buffer length.
Definition: RingBuffer.h:214
void test_write_read()
write()メソッドおよびread()メソッドのテスト


openrtm_aist
Author(s): Noriaki Ando
autogenerated on Mon Feb 28 2022 23:00:44