#include "DefaultBtMessageFactory.h" #include #include #include #include "Peer.h" #include "bittorrent_helper.h" #include "DownloadContext.h" #include "MockExtensionMessageFactory.h" #include "BtExtendedMessage.h" #include "BtPortMessage.h" #include "Exception.h" #include "FileEntry.h" namespace aria2 { class DefaultBtMessageFactoryTest:public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(DefaultBtMessageFactoryTest); CPPUNIT_TEST(testCreateBtMessage_BtExtendedMessage); CPPUNIT_TEST(testCreatePortMessage); CPPUNIT_TEST_SUITE_END(); private: std::unique_ptr dctx_; std::shared_ptr peer_; std::shared_ptr exmsgFactory_; std::unique_ptr factory_; public: void setUp() { dctx_ = make_unique(); peer_ = std::make_shared("192.168.0.1", 6969); peer_->allocateSessionResource(1024, 1024*1024); peer_->setExtendedMessagingEnabled(true); exmsgFactory_ = std::make_shared(); factory_ = make_unique(); factory_->setDownloadContext(dctx_.get()); factory_->setPeer(peer_); factory_->setExtensionMessageFactory(exmsgFactory_.get()); } void testCreateBtMessage_BtExtendedMessage(); void testCreatePortMessage(); }; CPPUNIT_TEST_SUITE_REGISTRATION(DefaultBtMessageFactoryTest); void DefaultBtMessageFactoryTest::testCreateBtMessage_BtExtendedMessage() { // payload:{4:name3:foo}->11bytes std::string payload = "4:name3:foo"; char msg[17];// 6+11bytes bittorrent::createPeerMessageString((unsigned char*)msg, sizeof(msg), 13, 20); msg[5] = 1; // Set dummy extended message ID 1 memcpy(msg+6, payload.c_str(), payload.size()); auto m = factory_->createBtMessage((const unsigned char*)msg+4, sizeof(msg)-4); CPPUNIT_ASSERT(BtExtendedMessage::ID == m->getId()); try { // disable extended messaging peer_->setExtendedMessagingEnabled(false); factory_->createBtMessage((const unsigned char*)msg+4, sizeof(msg)-4); CPPUNIT_FAIL("exception must be thrown."); } catch(Exception& e) { std::cerr << e.stackTrace() << std::endl; } } void DefaultBtMessageFactoryTest::testCreatePortMessage() { { unsigned char data[7]; bittorrent::createPeerMessageString(data, sizeof(data), 3, 9); bittorrent::setShortIntParam(&data[5], 6881); try { auto r = factory_->createBtMessage(&data[4], sizeof(data)-4); CPPUNIT_ASSERT(BtPortMessage::ID == r->getId()); auto m = static_cast(r.get()); CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getPort()); } catch(Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } { auto m = factory_->createPortMessage(6881); CPPUNIT_ASSERT_EQUAL((uint16_t)6881, m->getPort()); } } } // namespace aria2