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 <rtm/RingBuffer.h>
53 
54 //#define DEBUG
55 
56 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
57 typedef ::RTC::BufferStatus::Enum ReturnCode;
58 int isBlockTest = false;
60 
61 struct thread_arg
62 {
64  : m_buff(buff), m_n_loop(loop)
65  {}
67  int m_n_loop;
68 };
69 // 読み込みスレッド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
70 void* reader(void* arg)
71 {
72  thread_arg* t_arg = (thread_arg*)arg;
74 
76  for (int i = 0; i < t_arg->m_n_loop; i++) {
77  int output = -1;
78  ret = (*buff).read(output);
79 #if PRINTOUT
80  std::cout << "read() : " << output << std::endl;
81 #endif
82  if (ret == RTC::BufferStatus::TIMEOUT) {
83  g_ret = ret;
84  break;
85  }
86  if (isBlockTest) {
87  if (output != i) {
88  std::cout << "ERROR!!: output=" << output;
89  std::cout << ", correct data=" << i;
90  std::cout << ", return code=" << ret << std::endl;
91  abort();
92  }
93  }
94  }
95  return NULL;
96 }
97 
98 // 書き込みスレッド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
99 void* writer(void* arg)
100 {
101  thread_arg* t_arg = (thread_arg*)arg;
103 
104 
105  for (int i = 0; i < t_arg->m_n_loop; i++) {
106  int input = i;
107  (*buff).write(input);
108 #if PRINTOUT
109  std::cout << "write(" << input << ")" << std::endl;
110 #endif
111  }
112  return NULL;
113 }
114 
115 
116 namespace RingBuffer
117 {
123  : public CppUnit::TestFixture
124  {
125  CPPUNIT_TEST_SUITE(RingBufferTests);
126 
127  CPPUNIT_TEST(test_length);
128  CPPUNIT_TEST(test_isFull);
129  CPPUNIT_TEST(test_isEmpty);
130  CPPUNIT_TEST(test_init);
131  CPPUNIT_TEST(test_write_read);
132  CPPUNIT_TEST(test_write_read_with_small_length);
133  CPPUNIT_TEST(test_isNew);
134  CPPUNIT_TEST(test_reset);
135  CPPUNIT_TEST(test_wptr_put);
136  CPPUNIT_TEST(test_advanceWptr);
137  CPPUNIT_TEST(test_rptr_get);
138  CPPUNIT_TEST(test_advanceRptr);
139 
140  CPPUNIT_TEST(test_owrite_rback); // full: overwrite, empty: readback, buff length 1,8
141  CPPUNIT_TEST(test_owrite_dnothing); // full: overwrite, empty: do_nothing, buff length 1,8
142  CPPUNIT_TEST(test_owrite_block); // full: overwrite, empty: block, buff length 1,8
143 
144  CPPUNIT_TEST(test_dnothing_rback); // full: do_nothing, empty: readback, buff length 1,8
145  CPPUNIT_TEST(test_dnothing_dnothing); // full: do_nothing, empty: do_nothing, buff length 1,8
146  CPPUNIT_TEST(test_dnothing_block); // full: do_nothing, empty: block, buff length 1,8
147  CPPUNIT_TEST(test_block_rback); // full: block, empty: readback, buff length 1,8
148  CPPUNIT_TEST(test_block_dnothing); // full: block, empty: do_nothing, buff length 1,8
149  CPPUNIT_TEST(test_block_block_wr); // full: block, empty: block, buff length 1,8
150 
151  CPPUNIT_TEST(test_block_block_rw); // full: block, empty: block, read -> write
152 
153  CPPUNIT_TEST_SUITE_END();
154 
155  private:
156  void do_test(RTC::RingBuffer<int>& buff, int loop=NLOOP, bool read_first=false)
157  {
158  pthread_t tr, tw;
159  thread_arg arg(buff,loop);
160 
161  if (read_first) {
162  // 読み込みスレッドの開始 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
163  if (pthread_create(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) {
164  perror("pthread_create(r)");
165  return;
166  }
167  // 書き込みスレッドの開始 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
168  if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) {
169  perror("pthread_create(w)");
170  return;
171  }
172  }
173  else {
174  // 書き込みスレッドの開始// 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
175 // if (pthread_create(&tw, NULL , writer, static_cast<void *>(&buff)) != 0) {
176  if (pthread_create(&tw, NULL , writer, &arg) != 0) {
177  perror("pthread_create(w)");
178  return;
179  }
180  // 読み込みスレッドの開始// 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(&tr, NULL , reader, static_cast<void *>(&buff)) != 0) {
182  if (pthread_create(&tr, NULL , reader, &arg) != 0) {
183  perror("pthread_create(r)");
184  return;
185  }
186  }
187 
188  // スレッドの合流
189  pthread_join(tw, NULL);
190  pthread_join(tr, NULL);
191  }
192 
193  public:
198  {
199  }
200 
205  {
206  }
207 
211  virtual void setUp()
212  {
213  }
214 
218  virtual void tearDown()
219  {
220  }
221 
227  void test_length()
228  {
229  RTC::RingBuffer<int> buff(123);
230  CPPUNIT_ASSERT(buff.length() == 123);
231 
232  size_t len(456);
233  buff.length(len);
234  CPPUNIT_ASSERT(buff.length() == len);
235  }
236 
247  {
248  long int length = 10;
249  RTC::RingBuffer<int> buff(length);
250 
251  // (1) バッファ初期化直後、空ではないと判定されるか?
252  int initialValue = 12345;
253  for (unsigned int i(0); i < buff.length(); ++i)
254  {
255  buff.write(initialValue);
256  }
257  CPPUNIT_ASSERT_EQUAL(false, buff.empty());
258 
259  // (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
260  // いない場合、空ではないと判定されるか?
261  int readValue;
262  CPPUNIT_ASSERT_EQUAL(::RTC::BufferStatus::BUFFER_OK, buff.read(readValue));
263  CPPUNIT_ASSERT_EQUAL(false, buff.empty());
264 
265  // (3) 最後にデータが読み取られた後、新しいデータが書き込みされた
266  // 場合、空ではないと判定されるか?
267  int writeValue = 98765;
268  CPPUNIT_ASSERT_EQUAL(RTC::BufferBase<int>::BUFFER_OK, buff.write(writeValue));
269  CPPUNIT_ASSERT_EQUAL(false, buff.empty());
270  }
271 
272 
280  void test_isFull()
281  {
282  // (1) バッファが空の場合、フル判定は偽となるか?
283  int length1 = 10;
284  RTC::RingBuffer<int> buff1(length1);
285  CPPUNIT_ASSERT_EQUAL(false, buff1.full());
286 
287  // (2) 全バッファにデータが書き込まれている状態で、フル判定は真
288  // となるか?
289  int length2 = 10;
290  RTC::RingBuffer<int> buff2(length2);
291  for (int i = 0; i < length2; i++) {
292  buff2.write(i);
293  }
294  CPPUNIT_ASSERT_EQUAL(true, buff2.full());
295 
296  // (3) バッファに幾分データが書き込まれている状態で、フル判定は偽
297  // となるか?
298  int length3 = 10;
299  RTC::RingBuffer<int> buff3(length3);
300  for (int i = 0; i < length3 / 2; i++) {
301  buff3.write(i);
302  }
303  CPPUNIT_ASSERT_EQUAL(false, buff3.full());
304  }
305 
311  void test_init()
312  {
313  // バッファを作成して、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
314  long int length = 10;
315  RTC::RingBuffer<int> buff(length);
316 
317  int value = 12345;
318  for (unsigned int i(0); i < buff.length(); ++i)
319  {
320  buff.write(value);
321  }
322 
323  // 設定したデータを正しく読み出せるか?
324  int expected = 12345;
325  for (long int i = 0; i < length; i++) {
326  int actual;
327  buff.read(actual);
328  CPPUNIT_ASSERT_EQUAL(expected, actual);
329  }
330  }
331 
343  {
344  // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ
345  // を正しく読み出せるか?バッファ作成し、空のままにする 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
346  long int length1 = 3;
347  RTC::RingBuffer<int> buff1(length1);
349  prop["write.full_policy"] = "block";
350  prop["write.timeout"] = "5.0";
351  prop["read.empty_policy"] = "block";
352  prop["read.timeout"] = "5.0";
353 
354  buff1.init(prop);
355  // 1データ書込・読出を行う
356  for (int writeValue = 0; writeValue < 100; writeValue++) {
357  // 書込み 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
358  if (buff1.full())
359  {
360  std::cout << "### FULL ###" << std::endl;
361  int readValue;
362 
363  if (writeValue % 5 == 0)
364  {
365  while (!buff1.empty())
366  {
367  std::cout << "read timeout: " << 5 << std::endl;
368  buff1.read(readValue, 5);
369  std::cout << "read: " << readValue << std::endl;
370  }
371  std::cout << "read timeout: " << 5 << std::endl;
372  std::cout << "waiting 5 sec" << std::endl;
373  std::cout << "read ret: " << RTC::BufferStatus::toString(buff1.read(readValue, 5)) << std::endl;
374  std::cout << "read: " << readValue << std::endl;
375  }
376  else
377  {
378  buff1.read(readValue);
379  std::cout << "read: " << readValue << std::endl;
380  }
381 
382  if (buff1.full())
383  {
384  std::cout << "??? still full" << std::endl;
385  }
386  else
387  {
388  std::cout << "buffer full was blown over." << std::endl;
389  }
390  }
391  if (buff1.empty())
392  {
393  std::cout << "### EMPTY ###" << std::endl;
394  }
395 
396  // std::cout << "timeout-> " << writeValue << std::endl;
397  std::cout << "write ret: " << RTC::BufferStatus::toString(buff1.write(writeValue, writeValue)) << std::endl;
398 
399  // std::cout << "readable " << buff1.readable() << std::endl;
400  // std::cout << "writable " << buff1.writable() << std::endl;
401 
402  // 読出し
403  int readValue;
404  buff1.get(readValue);
405 
406  std::cout << writeValue << " == " << readValue << std::endl;
407 
408  // buff1.read(readValue)
409  // 書き込んだデータを正しく読み出せたか?
410  // CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
411  sleep(1);
412  }
413  return;
414  // (2) 全バッファにデータが書き込まれている状態で1データ書込・読
415  // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、
416  // フル状態にする 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
417  long int length2 = 10;
418  RTC::RingBuffer<int> buff2(length2);
419  for (int i = 0; i < length2; i++) {
420  buff2.write(i + 123);
421  }
422 
423  // 1データ書込・読出を行う
424  for (int writeValue = 0; writeValue < 100; writeValue++) {
425  // 書込み 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
426  buff2.write(writeValue);
427 
428  // 読出し
429  int readValue;
430  buff2.read(readValue);
431 
432  // 書き込んだデータを正しく読み出せたか?
433  CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
434  }
435 
436  // (3) バッファに幾分データが書き込まれている状態で1データ書込・
437  // 読出を行い、書き込んだデータを正しく読み出せるか?
438  long int length3 = 10;
439  RTC::RingBuffer<int> buff3(length3);
440  for (int i = 0; i < length3 / 2; i++) {
441  buff3.write(i + 123);
442  }
443 
444  // 1データ書込・読出を行う
445  for (int writeValue = 0; writeValue < 100; writeValue++) {
446  // 書込み 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
447  buff3.write(writeValue);
448 
449  // 読出し
450  int readValue;
451  buff3.read(readValue);
452 
453  // 書き込んだデータを正しく読み出せたか?
454  CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
455  }
456  }
457 
469  {
470  // (1) バッファ空状態で1データ書込・読出を行い、書き込んだデータ
471  // を正しく読み出せるか?バッファ作成し、空のままにする 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
472  long int length1 = 2;
473  RTC::RingBuffer<int> buff1(length1);
474 
475  // 1データ書込・読出を行う
476  for (int writeValue = 0; writeValue < 100; writeValue++) {
477  // 書込み 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  buff1.write(writeValue);
479 
480  // 読出し
481  int readValue;
482  buff1.read(readValue);
483 
484  // 書き込んだデータを正しく読み出せたか?
485  CPPUNIT_ASSERT_EQUAL(writeValue, readValue);
486  }
487 
488  // (2) 全バッファにデータが書き込まれている状態で1データ書込・読
489  // 出を行い、書き込んだデータを正しく読み出せるか?バッファ作成し、
490  // フル状態にする 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
491  long int length2 = 2;
492  RTC::RingBuffer<int> buff2(length2);
494  prop["write.full_policy"] = "overwrite";
495  buff2.init(prop);
496 
497  for (int i = 0; i < length2; i++) {
498  buff2.write(i + 123);
499  }
500 
501  // 1データ書込・読出を行う
502 // for (int writeValue = 0; writeValue < 100; writeValue++) {
503 // // 書込み// 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
504 // buff2.write(writeValue);
505 //
506 // // 読出し
507 // int readValue;
508 // buff2.read(readValue);
509 //
510 // // 書き込んだデータを正しく読み出せたか?
511 // CPPUNIT_ASSERT_EQUAL(writeValue+1+123, readValue);
512 // }
513 
514  // 書込み /* 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
515  /* policyがoverwriteでfull状態で書き込むと、古いデータを上書きし、読み込み側のポインタをインクリメントする。*/
516  buff2.write(0);
517 
518  CPPUNIT_ASSERT_EQUAL(true, buff2.full());
519  // 読出し
520  int readValue;
521  /* 読み出して読み込み側のポインタをインクメントするためfull状態ではなくなる */
522  buff2.read(readValue);
523 
524  CPPUNIT_ASSERT_EQUAL(false, buff2.full());
525  // 書き込んだデータを正しく読み出せたか?
526  CPPUNIT_ASSERT_EQUAL(1+123, readValue);
527 
528  // (3) バッファに幾分データが書き込まれている状態で1データ書込・読出を行い、書き込んだデータを正しく読み出せるか?
529  long int length3 = 2;
530  RTC::RingBuffer<int> buff3(length3);
531  coil::Properties prop3;
532  prop3["write.full_policy"] = "overwrite";
533  buff3.init(prop3);
534 
535  for (int i = 0; i < 1; i++) {
536  buff3.write(i + 123);
537  }
538  {
539  // 書込み 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
540  buff3.write(-1);
541 
542  // 読出し
543  int readValue;
544  buff3.read(readValue);
545 
546  // 書き込んだデータを正しく読み出せたか?
547  CPPUNIT_ASSERT_EQUAL(123, readValue);
548  }
549  // 1データ書込・読出を行う
550  for (int writeValue = 0; writeValue < 100; writeValue++) {
551  // 書込み 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
552  buff3.write(writeValue);
553 
554  // 読出し
555  int readValue;
556  buff3.read(readValue);
557 
558  // 書き込んだデータを正しく読み出せたか?
559  CPPUNIT_ASSERT_EQUAL(writeValue-1, readValue);
560  }
561  }
562 
576  void test_isNew()
577  {
578  // (1) バッファが空の状態で、isNew判定が偽になるか?
579  long int length1 = 10;
580  RTC::RingBuffer<int> buff1(length1);
581  CPPUNIT_ASSERT_EQUAL(true, buff1.empty());
582 
583  // 全バッファにデータが書き込まれている状態で...
584  long int length2 = 10;
585  RTC::RingBuffer<int> buff2(length2);
586 
587  for (int i = 0; i < length2; i++) {
588  // (2) ...データ書込後のisNew判定が真になるか?
589  int writeValue = i + 123;
590  buff2.write(writeValue);
591  CPPUNIT_ASSERT_EQUAL(false, buff2.empty());
592 
593  // (3) ...データ書込し、そのデータ読出を行った後のisNew判定が偽
594  // になるか?
595  int readValue;
596  buff2.read(readValue);
597  CPPUNIT_ASSERT_EQUAL(true, buff2.empty());
598  }
599 
600  // バッファに幾分データが書き込まれている状態で...
601  long int length3 = 10;
602  RTC::RingBuffer<int> buff3(length3);
603  for (int i = 0; i < length3 / 2; i++) {
604  buff3.write(i + 456);
605  }
606 
607  for (int i = 0; i < length3; i++) {
608  // (4) ...データ書込後のisNew判定が真になるか?
609  int writeValue = i + 123;
610  buff3.write(writeValue);
611  CPPUNIT_ASSERT_EQUAL(false, buff3.empty());
612 
613  // (5) ...データ書込し、そのデータ読出を行った後のisNew判定が偽
614  // になるか?
615  int readValue;
616  buff3.read(readValue);
617  CPPUNIT_ASSERT_EQUAL(false, buff3.empty());
618  }
619  }
624  void test_reset()
625  {
626  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
627  RTC::RingBuffer<int> buff(10);
628 
629  for(int ic(0);ic<8;++ic)
630  {
631  buff.put(idata[ic]);
632  buff.advanceWptr();
633  }
634  buff.advanceRptr(3);
635  CPPUNIT_ASSERT_EQUAL(buff.get(), idata[3]);
636  CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)5);
637 
638  buff.reset();
639  CPPUNIT_ASSERT(buff.empty());
640  CPPUNIT_ASSERT_EQUAL(buff.get(), idata[0]);
641  buff.put(idata[9]);
642  CPPUNIT_ASSERT_EQUAL(buff.get(), idata[9]);
643  CPPUNIT_ASSERT_EQUAL(buff.readable(), (size_t)0);
644 
645  }
651  {
652  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
653  RTC::RingBuffer<int> buff(10);
654  for(int ic(0);ic<10;++ic)
655  {
656  buff.put(idata[ic]);
657  buff.advanceWptr();
658  }
659  buff.reset();
660  for(int ic(0);ic<10;++ic)
661  {
662  CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.wptr(ic));
663  }
664  for(int ic(0);ic<10;++ic)
665  {
666  CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.wptr(-ic));
667  }
668  buff.advanceWptr(5);
669  for(int ic(0);ic<10;++ic)
670  {
671  CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.wptr(ic));
672  }
673  for(int ic(0);ic<10;++ic)
674  {
675  CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.wptr(-ic));
676  }
677 
678  }
684  {
685  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
686  RTC::RingBuffer<int> buff(10);
687  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET);
688  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK);
689  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET);
690  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK);
691  buff.reset();
692  for(int ic(0);ic<10;++ic)
693  {
694  buff.put(idata[ic]);
695  buff.advanceWptr();
696  }
697  buff.reset();
698  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(5),::RTC::BufferStatus::BUFFER_OK);
699  buff.advanceRptr(5);
700  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::PRECONDITION_NOT_MET);
701  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(8),::RTC::BufferStatus::BUFFER_OK);
702  CPPUNIT_ASSERT_EQUAL(idata[3],*buff.wptr());
703  CPPUNIT_ASSERT_EQUAL((size_t)8,buff.readable());
704  CPPUNIT_ASSERT_EQUAL(buff.advanceWptr(-5),::RTC::BufferStatus::BUFFER_OK);
705  CPPUNIT_ASSERT_EQUAL(idata[8],*buff.wptr());
706  CPPUNIT_ASSERT_EQUAL((size_t)3,buff.readable());
707  }
713  {
714  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
715  RTC::RingBuffer<int> buff(10);
716  for(int ic(0);ic<10;++ic)
717  {
718  buff.put(idata[ic]);
719  buff.advanceWptr();
720  }
721  buff.reset();
722  for(int ic(0);ic<10;++ic)
723  {
724  CPPUNIT_ASSERT_EQUAL(idata[ic],*buff.rptr(ic));
725  }
726  for(int ic(0);ic<10;++ic)
727  {
728  CPPUNIT_ASSERT_EQUAL(idata[(-ic+10)%10],*buff.rptr(-ic));
729  }
730  buff.advanceWptr(5);
731  buff.advanceRptr(5);
732  for(int ic(0);ic<10;++ic)
733  {
734  CPPUNIT_ASSERT_EQUAL(idata[(5+ic)%10],*buff.rptr(ic));
735  }
736  for(int ic(0);ic<10;++ic)
737  {
738  CPPUNIT_ASSERT_EQUAL(idata[(5-ic+10)%10],*buff.rptr(-ic));
739  }
740  buff.reset();
741  buff.advanceWptr(10);
742  for(int ic(0);ic<10;++ic)
743  {
744  CPPUNIT_ASSERT_EQUAL(idata[ic],buff.get());
745  int ret;
746  buff.get(ret);
747  CPPUNIT_ASSERT_EQUAL(idata[ic],ret);
748  buff.advanceRptr();
749  }
750  }
756  {
757  int idata[10] = {123,456,789,321,654,987,1234,3456,5678,7890};
758  RTC::RingBuffer<int> buff(10);
759  buff.advanceWptr(5);
760  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET);
761  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(5),::RTC::BufferStatus::BUFFER_OK);
762  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::PRECONDITION_NOT_MET);
763  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK);
764  buff.reset();
765  buff.advanceWptr(5);
766  buff.advanceRptr(5);
767  for(int ic(0);ic<10;++ic)
768  {
769  buff.put(idata[ic]);
770  buff.advanceWptr();
771  }
772  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-6),::RTC::BufferStatus::PRECONDITION_NOT_MET);
773  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(8),::RTC::BufferStatus::BUFFER_OK);
774  CPPUNIT_ASSERT_EQUAL(idata[8],*buff.rptr());
775  CPPUNIT_ASSERT_EQUAL((size_t)8,buff.writable());
776  CPPUNIT_ASSERT_EQUAL(buff.advanceRptr(-5),::RTC::BufferStatus::BUFFER_OK);
777  CPPUNIT_ASSERT_EQUAL(idata[3],*buff.rptr());
778  CPPUNIT_ASSERT_EQUAL((size_t)3,buff.writable());
779  }
780 
781  /*
782  * デッドロックの検証1
783  *
784  * バッファサイズ: 1, 8
785  * write.full_policy: overwrite
786  * read.empty_policy: readback
787  *
788  */
790  {
791  RTC::RingBuffer<int> buff(1);
792 
793  // デフォルト設定以外のバッファ
795  prop["write.full_policy"] = "overwrite";
796  prop["read.empty_policy"] = "readback";
797  buff.init(prop);
798 
800  do_test(buff);
801 
802  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
804 
805  RTC::RingBuffer<int> buff2(8);
806  buff2.init(prop);
807 
808  do_test(buff2);
809  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
811 
812  std::cout << std::flush;
813  return;
814  }
815 
816 
817  /*
818  * デッドロックの検証2
819  *
820  * バッファサイズ: 1, 8
821  * write.full_policy: overwrite
822  * read.empty_policy: do_nothing
823  *
824  */
826  {
827  RTC::RingBuffer<int> buff(1);
828 
829  // デフォルト設定以外のバッファ
831  prop["write.full_policy"] = "overwrite";
832  prop["read.empty_policy"] = "do_nothing";
833  buff.init(prop);
834 
836  do_test(buff);
837  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
839 
840 
841  RTC::RingBuffer<int> buff2(8);
842  buff2.init(prop);
843 
844  do_test(buff2);
845  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
847 
848  std::cout << std::flush;
849  return;
850  }
851 
852 
853  /*
854  * デッドロックの検証3
855  *
856  * バッファサイズ: 1, 8
857  * write.full_policy: overwrite
858  * read.empty_policy: block
859  * read.timeout: 3.0
860  *
861  */
863  {
864  RTC::RingBuffer<int> buff(1);
865 
866  // デフォルト設定以外のバッファ
868  prop["write.full_policy"] = "overwrite";
869  prop["read.empty_policy"] = "block";
870  prop["read.timeout"] = "3.0";
871  buff.init(prop);
872 
874  do_test(buff);
875  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
877 
878 
879  RTC::RingBuffer<int> buff2(8);
880  buff2.init(prop);
881  do_test(buff2);
882  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
884 
885 
886  std::cout << std::flush;
887  return;
888  }
889 
890 
891  /*
892  * デッドロックの検証4
893  *
894  * バッファサイズ: 1, 8
895  * write.full_policy: do_nothing
896  * read.empty_policy: readback
897  *
898  */
900  {
901  RTC::RingBuffer<int> buff(1);
902 
903  // デフォルト設定以外のバッファ
905  prop["write.full_policy"] = "do_nothing";
906  prop["read.empty_policy"] = "readback";
907  buff.init(prop);
908 
910  do_test(buff);
911  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
913 
914 
915  RTC::RingBuffer<int> buff2(8);
916  buff2.init(prop);
917  do_test(buff2);
918  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
920 
921 
922  std::cout << std::flush;
923  return;
924  }
925 
926 
927  /*
928  * デッドロックの検証5
929  *
930  * バッファサイズ: 1, 8
931  * write.full_policy: do_nothing
932  * read.empty_policy: do_nothing
933  *
934  */
936  {
937  RTC::RingBuffer<int> buff(1);
938 
939  // デフォルト設定以外のバッファ
941  prop["write.full_policy"] = "do_nothing";
942  prop["read.empty_policy"] = "do_nothing";
943  buff.init(prop);
944 
946  do_test(buff);
947  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
949 
950 
951  RTC::RingBuffer<int> buff2(8);
952  buff2.init(prop);
953  do_test(buff2);
954  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
956 
957 
958  std::cout << std::flush;
959  return;
960  }
961 
962 
963  /*
964  * デッドロックの検証6
965  *
966  * バッファサイズ: 1, 8
967  * write.full_policy: do_nothing
968  * read.empty_policy: block
969  * read.timeout: 1.0
970  *
971  */
973  {
974  RTC::RingBuffer<int> buff(1);
975 
976  // デフォルト設定以外のバッファ
978  prop["write.full_policy"] = "do_nothing";
979  prop["read.empty_policy"] = "block";
980  prop["read.timeout"] = "1.0";
981  buff.init(prop);
982 
984  do_test(buff);
985  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
987 
988 
989  RTC::RingBuffer<int> buff2(8);
990  buff2.init(prop);
991  do_test(buff2);
992  // CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
994 
995 
996  std::cout << std::flush;
997  return;
998  }
999 
1000 
1001  /*
1002  * デッドロックの検証7
1003  *
1004  * バッファサイズ: 1, 8
1005  * write.full_policy: block
1006  * read.empty_policy: readback
1007  * write.timeout: 1.0
1008  *
1009  */
1011  {
1012  RTC::RingBuffer<int> buff(1);
1013 
1014  // デフォルト設定以外のバッファ
1016  prop["write.full_policy"] = "block";
1017  prop["read.empty_policy"] = "readback";
1018  prop["write.timeout"] = "1.0";
1019  buff.init(prop);
1020 
1022  do_test(buff,100);
1023  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1025 
1026 
1027  RTC::RingBuffer<int> buff2(8);
1028  buff2.init(prop);
1029  do_test(buff2,100);
1030  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1032 
1033 
1034  std::cout << std::flush;
1035  return;
1036  }
1037 
1038 
1039  /*
1040  * デッドロックの検証8
1041  *
1042  * バッファサイズ: 1, 8
1043  * write.full_policy: block
1044  * read.empty_policy: do_nothing
1045  * write.timeout: 1.0
1046  *
1047  */
1049  {
1050  RTC::RingBuffer<int> buff(1);
1051 
1052  // デフォルト設定以外のバッファ
1054  prop["write.full_policy"] = "block";
1055  prop["read.empty_policy"] = "do_nothing";
1056  prop["write.timeout"] = "1.0";
1057  buff.init(prop);
1058 
1060  do_test(buff,100);
1061  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1063 
1064 
1065  RTC::RingBuffer<int> buff2(8);
1066  buff2.init(prop);
1067  do_test(buff2,100);
1068  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1070 
1071 
1072  std::cout << std::flush;
1073  return;
1074  }
1075 
1076 
1077  /*
1078  * デッドロックの検証9
1079  *
1080  * バッファサイズ: 1, 8
1081  * write.full_policy: block
1082  * read.empty_policy: block
1083  * write.timeout: 3.0
1084  * read.timeout: 3.0
1085  *
1086  */
1088  {
1089  RTC::RingBuffer<int> buff(1);
1090 
1091  // デフォルト設定以外のバッファ
1093  prop["write.full_policy"] = "block";
1094  prop["read.empty_policy"] = "block";
1095  prop["write.timeout"] = "3.0";
1096  prop["read.timeout"] = "3.0";
1097  buff.init(prop);
1098 
1099  isBlockTest = true;
1101  do_test(buff);
1102  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1104 
1105 
1106  RTC::RingBuffer<int> buff2(8);
1107  buff2.init(prop);
1108  do_test(buff2);
1109  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1111 
1112 
1113  isBlockTest = false;
1114  std::cout << std::flush;
1115  return;
1116  }
1117 
1118 
1119  /*
1120  * デッドロックの検証10 read -> write
1121  *
1122  * バッファサイズ: 1, 8
1123  * write.full_policy: block
1124  * read.empty_policy: block
1125  * write.timeout: 3.0
1126  * read.timeout: 3.0
1127  *
1128  */
1130  {
1131  RTC::RingBuffer<int> buff(1);
1132 
1133  // デフォルト設定以外のバッファ
1135  prop["write.full_policy"] = "block";
1136  prop["read.empty_policy"] = "block";
1137  prop["write.timeout"] = "3.0";
1138  prop["read.timeout"] = "3.0";
1139  buff.init(prop);
1140 
1141  isBlockTest = true;
1143  do_test(buff,true);
1144  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1146 
1147 
1148  RTC::RingBuffer<int> buff2(8);
1149  buff2.init(prop);
1150  do_test(buff2,true);
1151  CPPUNIT_ASSERT(g_ret == RTC::BufferStatus::BUFFER_OK);
1153 
1154 
1155  isBlockTest = false;
1156  std::cout << std::flush;
1157  return;
1158  }
1159 
1160 
1161 
1162  };
1163 }; // namespace RingBuffer
1164 
1165 /*
1166  * Register test suite
1167  */
1169 
1170 #ifdef LOCAL_MAIN
1171 int main(int argc, char* argv[])
1172 {
1173 
1174  FORMAT format = TEXT_OUT;
1175  int target = 0;
1176  std::string xsl;
1177  std::string ns;
1178  std::string fname;
1179  std::ofstream ofs;
1180 
1181  int i(1);
1182  while (i < argc)
1183  {
1184  std::string arg(argv[i]);
1185  std::string next_arg;
1186  if (i + 1 < argc) next_arg = argv[i + 1];
1187  else next_arg = "";
1188 
1189  if (arg == "--text") { format = TEXT_OUT; break; }
1190  if (arg == "--xml")
1191  {
1192  if (next_arg == "")
1193  {
1194  fname = argv[0];
1195  fname += ".xml";
1196  }
1197  else
1198  {
1199  fname = next_arg;
1200  }
1201  format = XML_OUT;
1202  ofs.open(fname.c_str());
1203  }
1204  if ( arg == "--compiler" ) { format = COMPILER_OUT; break; }
1205  if ( arg == "--cerr" ) { target = 1; break; }
1206  if ( arg == "--xsl" )
1207  {
1208  if (next_arg == "") xsl = "default.xsl";
1209  else xsl = next_arg;
1210  }
1211  if ( arg == "--namespace" )
1212  {
1213  if (next_arg == "")
1214  {
1215  std::cerr << "no namespace specified" << std::endl;
1216  exit(1);
1217  }
1218  else
1219  {
1220  xsl = next_arg;
1221  }
1222  }
1223  ++i;
1224  }
1225  CppUnit::TextUi::TestRunner runner;
1226  if ( ns.empty() )
1227  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry().makeTest());
1228  else
1229  runner.addTest(CppUnit::TestFactoryRegistry::getRegistry(ns).makeTest());
1230  CppUnit::Outputter* outputter = 0;
1231  std::ostream* stream = target ? &std::cerr : &std::cout;
1232  switch ( format )
1233  {
1234  case TEXT_OUT :
1235  outputter = new CppUnit::TextOutputter(&runner.result(),*stream);
1236  break;
1237  case XML_OUT :
1238  std::cout << "XML_OUT" << std::endl;
1239  outputter = new CppUnit::XmlOutputter(&runner.result(),
1240  ofs, "shift_jis");
1241  static_cast<CppUnit::XmlOutputter*>(outputter)->setStyleSheet(xsl);
1242  break;
1243  case COMPILER_OUT :
1244  outputter = new CppUnit::CompilerOutputter(&runner.result(),*stream);
1245  break;
1246  }
1247  runner.setOutputter(outputter);
1248  runner.run();
1249  return 0; // runner.run() ? 0 : 1;
1250 }
1251 #endif // MAIN
1252 #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)
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
virtual bool full(void) const
Check on whether the buffer is full.
Definition: RingBuffer.h:540
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
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 size_t readable() const
Write data into the buffer.
Definition: RingBuffer.h:804
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
virtual size_t length(void) const
Get the buffer length.
Definition: RingBuffer.h:214
void test_isEmpty()
isEmpty()メソッドのテスト
void test_wptr_put()
wptr(),put()メソッドのテスト
virtual bool empty(void) const
Check on whether the buffer is empty.
Definition: RingBuffer.h:829
void * writer(void *arg)
BufferBase abstract class.
Definition: BufferBase.h:104
void test_isNew()
isNew()メソッドのテスト
virtual size_t writable() const
Write data into the buffer.
Definition: RingBuffer.h:515
void test_write_read()
write()メソッドおよびread()メソッドのテスト


openrtm_aist
Author(s): Noriaki Ando
autogenerated on Mon Jun 10 2019 14:07:54