mirror of https://github.com/aria2/aria2
				
				
				
			
		
			
				
	
	
		
			155 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			155 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			C++
		
	
	
#include "ChunkedDecoder.h"
 | 
						|
#include "DlAbortEx.h"
 | 
						|
#include <iostream>
 | 
						|
#include <cppunit/extensions/HelperMacros.h>
 | 
						|
 | 
						|
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<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("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<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>
 | 
						|
      ("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<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("1");
 | 
						|
    CPPUNIT_ASSERT_EQUAL(std::string(),
 | 
						|
			 decoder.decode(msg.c_str(), msg.size()));
 | 
						|
  }
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("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<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("10\r\n1234567890");
 | 
						|
    CPPUNIT_ASSERT_EQUAL(std::string("1234567890"),
 | 
						|
			 decoder.decode(msg.c_str(), msg.size()));
 | 
						|
  }
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("123456\r\n");
 | 
						|
    CPPUNIT_ASSERT_EQUAL(std::string("123456"),
 | 
						|
			 decoder.decode(msg.c_str(), msg.size()));
 | 
						|
  }
 | 
						|
  // no trailing CR LF.
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>
 | 
						|
      ("10\r\n1234567890123456");
 | 
						|
    CPPUNIT_ASSERT_EQUAL(std::string("1234567890123456"),
 | 
						|
			 decoder.decode(msg.c_str(), msg.size()));
 | 
						|
  }
 | 
						|
  // feed only CR
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>
 | 
						|
      ("\r");
 | 
						|
    CPPUNIT_ASSERT_EQUAL(std::string(),
 | 
						|
			 decoder.decode(msg.c_str(), msg.size()));
 | 
						|
  }
 | 
						|
  // feed next LF
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>
 | 
						|
      ("\n");
 | 
						|
    CPPUNIT_ASSERT_EQUAL(std::string(),
 | 
						|
			 decoder.decode(msg.c_str(), msg.size()));
 | 
						|
  }
 | 
						|
  // feed 0 CR LF.
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>
 | 
						|
      ("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<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("ffffffffffffffff\r\n");
 | 
						|
    ChunkedDecoder decoder;
 | 
						|
    decoder.decode(msg.c_str(), msg.size());
 | 
						|
  }
 | 
						|
  // chunkSize 2^64 causes error
 | 
						|
  {
 | 
						|
    std::basic_string<unsigned char> msg =
 | 
						|
      reinterpret_cast<const unsigned char*>("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<unsigned char> msg =
 | 
						|
    reinterpret_cast<const unsigned char*>("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
 |