TransferTest.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2005-2007 by Peter Dimov.
00004 
00005 This file is part of Calitko (http://www.calitko.org).
00006 
00007 Calitko is free software; you can redistribute it and/or modify
00008 it under the terms of the GNU General Public License as published by
00009 the Free Software Foundation; either version 2 of the License, or
00010 (at your option) any later version.
00011 
00012 Calitko is distributed in the hope that it will be useful,
00013 but WITHOUT ANY WARRANTY; without even the implied warranty of
00014 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015 GNU General Public License for more details.
00016 
00017 You should have received a copy of the GNU General Public License
00018 along with Calitko; if not, write to the Free Software
00019 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
00020 
00021 */
00022 
00023 #include "Qt.h"
00024 #include "../Transfer.h"
00025 #include "generated/PacketProcessorMock.h"
00026 #include "generated/TransferDriver.h"
00027 #include "generated/TransferMock.h" // \todo remove after all interfaces get their own module
00028 #include "generated/TransferSessionMock.h"
00029 #include "Imports.cpp"
00030 
00031 namespace Protocols {
00032 namespace BitTorrent {
00033 namespace Transfers {
00034 namespace Testing {
00035 
00037 
00039 class TransferTest : public CppUnit::TestFixture
00040 {
00041     CPPUNIT_TEST_SUITE(TransferTest);
00042     CPPUNIT_TEST (testStartTransferForTorrent);
00043     CPPUNIT_TEST (testPeersReturnedFromTrackerAddedToSessionManager);
00044     CPPUNIT_TEST (testEstablishedSessionAllPacketProcessorsAreNotified);
00045     CPPUNIT_TEST (testIncomingPacketForwardedToAllPacketProcessors);
00046     CPPUNIT_TEST (testOutgoingPacketForwardedToAllPacketProcessors);
00047     CPPUNIT_TEST (testClosingSessionDoesNothing);
00048     CPPUNIT_TEST (testClosedSessionAllPacketProcessorsAreNotified);
00049     CPPUNIT_TEST (testStopTransfer);
00050     CPPUNIT_TEST_SUITE_END();
00051 
00052     auto_ptr <TrackerManagerMock>   trackerManager;
00053     auto_ptr <SessionManagerMock>   sessionManager;
00054     auto_ptr <PacketProcessorMock>  choker;
00055     auto_ptr <PacketProcessorMock>  pieceRequester;
00056     auto_ptr <PacketProcessorMock>  pieceProvider;
00057     auto_ptr <Transfer>             transferReal;
00058     auto_ptr <TransferDriver>       transfer;
00059 
00060     const QList <PeerInfo>          peers;
00061     const PeerInfo::PeerId          peerId;
00062     const Packet                    packet;
00063     auto_ptr <TransferSessionMock>  session;
00064 
00065 public:
00066     TransferTest();
00067 
00068     void setUp()
00069     {
00070         trackerManager.reset (new TrackerManagerMock());
00071         sessionManager.reset (new SessionManagerMock());
00072         choker.reset (new PacketProcessorMock());
00073         pieceRequester.reset (new PacketProcessorMock());
00074         pieceProvider.reset (new PacketProcessorMock());
00075         QList <PacketProcessor *> packetProcessors;
00076         packetProcessors.append (*choker);
00077         packetProcessors.append (*pieceRequester);
00078         packetProcessors.append (*pieceProvider);
00079         transferReal.reset (new Transfer(*trackerManager, *sessionManager,
00080                                          packetProcessors));
00081         transfer.reset (new TransferDriver (*transferReal.get()));
00082         session.reset (new TransferSessionMock());
00083     }
00084 
00085     void tearDown()
00086     {
00087         transfer.reset();
00088         transferReal.reset();
00089         pieceProvider.reset();
00090         pieceRequester.reset();
00091         choker.reset();
00092         sessionManager.reset();
00093         trackerManager.reset();
00094         session.reset();
00095     }
00096 
00097     void testStartTransferForTorrent()
00098     {
00099         Torrent torrent;
00100 
00101         call (transfer->start (torrent))
00102             .willCall (trackerManager->start (torrent.announce()))
00103             .returns()
00104             .willCall (sessionManager->start())
00105             .returns()
00106         .returns();
00107     }
00108 
00109     void stateTransferStarted()
00110     {
00111         testStartTransferForTorrent();
00112     }
00113 
00114     void testPeersReturnedFromTrackerAddedToSessionManager()
00115     {
00116         call (transfer->trackerManagerFoundPeers (peers))
00117             .willCall (sessionManager->addPeers (peers))
00118             .returns()
00119         .returns();
00120     }
00121 
00122     void testEstablishedSessionAllPacketProcessorsAreNotified()
00123     {
00124         call (transfer->sessionManagerEstablishedSession (*session))
00125             .willCall (choker->openedSession (*session))
00126             .returns()
00127             .willCall (pieceRequester->openedSession (*session))
00128             .returns()
00129             .willCall (pieceProvider->openedSession (*session))
00130             .returns()
00131         .returns();
00132     }
00133 
00134     void testIncomingPacketForwardedToAllPacketProcessors()
00135     {
00136         call (transfer->transferSessionReceivedPacket (*session, packet))
00137             .willCall (choker->incomingPacket (*session, packet))
00138             .returns()
00139             .willCall (pieceRequester->incomingPacket (*session, packet))
00140             .returns()
00141             .willCall (pieceProvider->incomingPacket (*session, packet))
00142             .returns()
00143         .returns();
00144     }
00145 
00146     void testOutgoingPacketForwardedToAllPacketProcessors()
00147     {
00148         call (transfer->transferSessionSendingPacket (*session, packet))
00149             .willCall (choker->outgoingPacket (*session, packet))
00150             .returns()
00151             .willCall (pieceRequester->outgoingPacket (*session, packet))
00152             .returns()
00153             .willCall (pieceProvider->outgoingPacket (*session, packet))
00154             .returns()
00155         .returns();
00156     }
00157 
00158     void testClosingSessionDoesNothing()
00159     {
00160         call (transfer->transferSessionClosing (*session))
00161         .returns();
00162     }
00163 
00164     void testClosedSessionAllPacketProcessorsAreNotified()
00165     {
00166         call (transfer->transferSessionClosed (*session))
00167             .willCall (choker->closedSession (*session))
00168             .returns()
00169             .willCall (pieceRequester->closedSession (*session))
00170             .returns()
00171             .willCall (pieceProvider->closedSession (*session))
00172             .returns()
00173             .willCall (sessionManager->closedSession (*session))
00174             .returns()
00175         .returns();
00176     }
00177 
00178     void testStopTransfer()
00179     {
00180         call (transfer->stop())
00181             .willCall (trackerManager->stop())
00182             .returns()
00183             .willCall (sessionManager->stop())
00184             .returns()
00185         .returns();
00186     }
00187 };
00188 
00189 TransferTest::TransferTest()
00190  :  trackerManager(), sessionManager(), choker(), pieceRequester(),
00191     pieceProvider(), transferReal(), transfer(), peers(), peerId(), packet(),
00192     session()
00193 {
00194 }
00195 
00196 CPPUNIT_TEST_SUITE_REGISTRATION(TransferTest);
00197 
00198 } // namespace Testing
00199 } // namespace Transfers
00200 } // namespace BitTorrent
00201 } // namespace Protocols