#include "ChunkedDecoder.h" #include "DlAbortEx.h" #include #include namespace aria2 { class ChunkedDecoderTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(ChunkedDecoderTest); CPPUNIT_TEST(testDecode); CPPUNIT_TEST(testDecode_tooLargeChunkSize); CPPUNIT_TEST(testDecode_chunkSizeMismatch); CPPUNIT_TEST(testGetName); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} void testDecode(); void testDecode_tooLargeChunkSize(); void testDecode_chunkSizeMismatch(); void testGetName(); }; CPPUNIT_TEST_SUITE_REGISTRATION( ChunkedDecoderTest ); void ChunkedDecoderTest::testDecode() { ChunkedDecoder decoder; decoder.init(); { std::basic_string msg = reinterpret_cast("a\r\n1234567890\r\n"); CPPUNIT_ASSERT_EQUAL(std::string("1234567890"), decoder.decode(msg.c_str(), msg.size())); } // Feed extension; see it is ignored. { std::basic_string msg = reinterpret_cast ("3;extensionIgnored\r\n123\r\n"); CPPUNIT_ASSERT_EQUAL(std::string("123"), decoder.decode(msg.c_str(), msg.size())); } // Not all chunk size is available { std::basic_string msg = reinterpret_cast("1"); CPPUNIT_ASSERT_EQUAL(std::string(), decoder.decode(msg.c_str(), msg.size())); } { std::basic_string msg = reinterpret_cast("0\r\n1234567890123456\r\n"); CPPUNIT_ASSERT_EQUAL(std::string("1234567890123456"), decoder.decode(msg.c_str(), msg.size())); } // Not all chunk data is available { std::basic_string msg = reinterpret_cast("10\r\n1234567890"); CPPUNIT_ASSERT_EQUAL(std::string("1234567890"), decoder.decode(msg.c_str(), msg.size())); } { std::basic_string msg = reinterpret_cast("123456\r\n"); CPPUNIT_ASSERT_EQUAL(std::string("123456"), decoder.decode(msg.c_str(), msg.size())); } // no trailing CR LF. { std::basic_string msg = reinterpret_cast ("10\r\n1234567890123456"); CPPUNIT_ASSERT_EQUAL(std::string("1234567890123456"), decoder.decode(msg.c_str(), msg.size())); } // feed only CR { std::basic_string msg = reinterpret_cast ("\r"); CPPUNIT_ASSERT_EQUAL(std::string(), decoder.decode(msg.c_str(), msg.size())); } // feed next LF { std::basic_string msg = reinterpret_cast ("\n"); CPPUNIT_ASSERT_EQUAL(std::string(), decoder.decode(msg.c_str(), msg.size())); } // feed 0 CR LF. { std::basic_string msg = reinterpret_cast ("0\r\n"); CPPUNIT_ASSERT_EQUAL(std::string(), decoder.decode(msg.c_str(), msg.size())); } // input is over CPPUNIT_ASSERT(decoder.finished()); decoder.release(); } void ChunkedDecoderTest::testDecode_tooLargeChunkSize() { // chunkSize should be under 2^64-1 { std::basic_string msg = reinterpret_cast("ffffffffffffffff\r\n"); ChunkedDecoder decoder; decoder.decode(msg.c_str(), msg.size()); } // chunkSize 2^64 causes error { std::basic_string msg = reinterpret_cast("10000000000000000\r\n"); ChunkedDecoder decoder; try { decoder.decode(msg.c_str(), msg.size()); CPPUNIT_FAIL("exception must be thrown."); } catch(DlAbortEx& e) { // success } } } void ChunkedDecoderTest::testDecode_chunkSizeMismatch() { std::basic_string msg = reinterpret_cast("3\r\n1234\r\n"); ChunkedDecoder decoder; try { decoder.decode(msg.c_str(), msg.size()); CPPUNIT_FAIL("exception must be thrown."); } catch(DlAbortEx& e) { // success } } void ChunkedDecoderTest::testGetName() { ChunkedDecoder decoder; CPPUNIT_ASSERT_EQUAL(std::string("ChunkedDecoder"), decoder.getName()); } } // namespace aria2