diff options
| author | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-11-20 15:42:25 +0000 |
|---|---|---|
| committer | Tatsuhiro Tsujikawa <tatsuhiro.t@gmail.com> | 2009-11-20 15:42:25 +0000 |
| commit | 93968c4fa525d44bf83fb221874a8b8febee3905 (patch) | |
| tree | ca34cb33f56f18a04b0a154d19f0bd8df47edf33 /test/UTMetadataRequestExtensionMessageTest.cc | |
| parent | 2764b6739d0b0414cf0ce31c2f8db5b24f68b75e (diff) | |
2009-11-21 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Initial support of Extension for Peers to Send Metadata
Files(BEP9). Currently aria2 only serves metadata and cannot get
metadata from swarm.
* src/BtConstants.h
* src/DefaultBtInteractive.cc
* src/DefaultExtensionMessageFactory.cc
* src/DefaultExtensionMessageFactory.h
* src/ExtensionMessage.h
* src/ExtensionMessageRegistry.h
* src/HandshakeExtensionMessage.cc
* src/HandshakeExtensionMessage.h
* src/Makefile.am
* src/PeerConnection.h
* src/PeerInteractionCommand.cc
* src/UTMetadataDataExtensionMessage.cc
* src/UTMetadataDataExtensionMessage.h
* src/UTMetadataExtensionMessage.cc
* src/UTMetadataExtensionMessage.h
* src/UTMetadataRejectExtensionMessage.cc
* src/UTMetadataRejectExtensionMessage.h
* src/UTMetadataRequestExtensionMessage.cc
* src/UTMetadataRequestExtensionMessage.h
* src/bittorrent_helper.cc
* src/bittorrent_helper.h
* test/BittorrentHelperTest.cc
* test/DefaultExtensionMessageFactoryTest.cc
* test/HandshakeExtensionMessageTest.cc
* test/Makefile.am
* test/UTMetadataDataExtensionMessageTest.cc
* test/UTMetadataRejectExtensionMessageTest.cc
* test/UTMetadataRequestExtensionMessageTest.cc
Diffstat (limited to 'test/UTMetadataRequestExtensionMessageTest.cc')
| -rw-r--r-- | test/UTMetadataRequestExtensionMessageTest.cc | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/test/UTMetadataRequestExtensionMessageTest.cc b/test/UTMetadataRequestExtensionMessageTest.cc new file mode 100644 index 00000000..6d21d776 --- /dev/null +++ b/test/UTMetadataRequestExtensionMessageTest.cc @@ -0,0 +1,186 @@ +#include "UTMetadataRequestExtensionMessage.h" + +#include <iostream> + +#include <cppunit/extensions/HelperMacros.h> + +#include "Peer.h" +#include "DownloadContext.h" +#include "MockBtMessage.h" +#include "MockBtMessageDispatcher.h" +#include "MockBtMessageFactory.h" +#include "bittorrent_helper.h" +#include "BtHandshakeMessage.h" +#include "UTMetadataRejectExtensionMessage.h" +#include "UTMetadataDataExtensionMessage.h" + +namespace aria2 { + +class UTMetadataRequestExtensionMessageTest:public CppUnit::TestFixture { + + CPPUNIT_TEST_SUITE(UTMetadataRequestExtensionMessageTest); + CPPUNIT_TEST(testGetExtensionMessageID); + CPPUNIT_TEST(testGetExtensionName); + CPPUNIT_TEST(testGetBencodedData); + CPPUNIT_TEST(testToString); + CPPUNIT_TEST(testDoReceivedAction_reject); + CPPUNIT_TEST(testDoReceivedAction_data); + CPPUNIT_TEST_SUITE_END(); +public: + class MockExtensionMessage:public MockBtMessage { + public: + SharedHandle<ExtensionMessage> _m; + + MockExtensionMessage(const SharedHandle<ExtensionMessage>& m):_m(m) {} + }; + + class MockBtMessageFactory2:public MockBtMessageFactory { + public: + virtual SharedHandle<BtMessage> + createBtExtendedMessage(const SharedHandle<ExtensionMessage>& extmsg) + { + return SharedHandle<BtMessage>(new MockExtensionMessage(extmsg)); + } + }; + + SharedHandle<DownloadContext> _dctx; + SharedHandle<MockBtMessageFactory2> _messageFactory; + SharedHandle<MockBtMessageDispatcher> _dispatcher; + SharedHandle<Peer> _peer; + + void setUp() + { + _messageFactory.reset(new MockBtMessageFactory2()); + _dispatcher.reset(new MockBtMessageDispatcher()); + _dctx.reset(new DownloadContext()); + BDE attrs = BDE::dict(); + _dctx->setAttribute(bittorrent::BITTORRENT, attrs); + _peer.reset(new Peer("host", 6880)); + _peer->allocateSessionResource(0, 0); + _peer->setExtension("ut_metadata", 1); + } + + template<typename T> + SharedHandle<T> getFirstDispatchedMessage() + { + SharedHandle<MockExtensionMessage> wrapmsg = + dynamic_pointer_cast<MockExtensionMessage> + (_dispatcher->messageQueue.front()); + + SharedHandle<T> msg = dynamic_pointer_cast<T>(wrapmsg->_m); + return msg; + } + + void testGetExtensionMessageID(); + void testGetExtensionName(); + void testGetBencodedData(); + void testToString(); + void testDoReceivedAction_reject(); + void testDoReceivedAction_data(); +}; + + +CPPUNIT_TEST_SUITE_REGISTRATION(UTMetadataRequestExtensionMessageTest); + +void UTMetadataRequestExtensionMessageTest::testGetExtensionMessageID() +{ + UTMetadataRequestExtensionMessage msg(1); + CPPUNIT_ASSERT_EQUAL((uint8_t)1, msg.getExtensionMessageID()); +} + +void UTMetadataRequestExtensionMessageTest::testGetExtensionName() +{ + UTMetadataRequestExtensionMessage msg(1); + CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata"), msg.getExtensionName()); +} + +void UTMetadataRequestExtensionMessageTest::testGetBencodedData() +{ + UTMetadataRequestExtensionMessage msg(1); + msg.setIndex(99); + CPPUNIT_ASSERT_EQUAL + (std::string("d8:msg_typei0e5:piecei99ee"), msg.getBencodedData()); +} + +void UTMetadataRequestExtensionMessageTest::testToString() +{ + UTMetadataRequestExtensionMessage msg(1); + msg.setIndex(100); + CPPUNIT_ASSERT_EQUAL(std::string("ut_metadata request piece=100"), + msg.toString()); +} + +void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_reject() +{ + UTMetadataRequestExtensionMessage msg(1); + msg.setIndex(10); + msg.setDownloadContext(_dctx); + msg.setPeer(_peer); + msg.setBtMessageFactory(_messageFactory); + msg.setBtMessageDispatcher(_dispatcher); + msg.doReceivedAction(); + + SharedHandle<UTMetadataRejectExtensionMessage> m = + getFirstDispatchedMessage<UTMetadataRejectExtensionMessage>(); + + CPPUNIT_ASSERT(!m.isNull()); + CPPUNIT_ASSERT_EQUAL((size_t)10, m->getIndex()); + CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID()); +} + +void UTMetadataRequestExtensionMessageTest::testDoReceivedAction_data() +{ + UTMetadataRequestExtensionMessage msg(1); + msg.setIndex(1); + msg.setDownloadContext(_dctx); + msg.setPeer(_peer); + msg.setBtMessageFactory(_messageFactory); + msg.setBtMessageDispatcher(_dispatcher); + + size_t metadataSize = METADATA_PIECE_SIZE*2; + BDE& attrs = _dctx->getAttribute(bittorrent::BITTORRENT); + std::string first(METADATA_PIECE_SIZE, '0'); + std::string second(METADATA_PIECE_SIZE, '1'); + attrs[bittorrent::METADATA] = first+second; + attrs[bittorrent::METADATA_SIZE] = metadataSize; + + msg.doReceivedAction(); + + SharedHandle<UTMetadataDataExtensionMessage> m = + getFirstDispatchedMessage<UTMetadataDataExtensionMessage>(); + + CPPUNIT_ASSERT(!m.isNull()); + CPPUNIT_ASSERT_EQUAL((size_t)1, m->getIndex()); + CPPUNIT_ASSERT_EQUAL(second, m->getData()); + CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize()); + CPPUNIT_ASSERT_EQUAL((uint8_t)1, m->getExtensionMessageID()); + + _dispatcher->messageQueue.clear(); + + msg.setIndex(2); + + metadataSize += 100; + std::string third(100, '2'); + attrs[bittorrent::METADATA] = attrs[bittorrent::METADATA].s()+third; + attrs[bittorrent::METADATA_SIZE] = metadataSize; + + msg.doReceivedAction(); + + m = getFirstDispatchedMessage<UTMetadataDataExtensionMessage>(); + + CPPUNIT_ASSERT(!m.isNull()); + CPPUNIT_ASSERT_EQUAL((size_t)2, m->getIndex()); + CPPUNIT_ASSERT_EQUAL(third, m->getData()); + CPPUNIT_ASSERT_EQUAL(metadataSize, m->getTotalSize()); + + msg.setIndex(3); + + try { + msg.doReceivedAction(); + CPPUNIT_FAIL("exception must be thrown."); + } catch(DlAbortEx& e) { + // success + } +} + +} // namespace aria2 |
