TrackerManagerImplTest.cpp

Go to the documentation of this file.
00001 /*
00002 
00003 Copyright (C) 2006-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 "../TrackerManagerImpl.h"
00025 #include "../TrackerRequest.h"
00026 #include "../TrackerRequestSession.h"
00027 #include "../TrackerRequestSessionFactory.h"
00028 #include "../TrackerResponse.h"
00029 #include "../TrackerResponseParser.h"
00030 #include "generated/TrackerRequestSessionMock.h"
00031 #include "generated/TrackerRequestSessionFactoryMock.h"
00032 #include "generated/TrackerManagerMock.h"
00033 #include "generated/TrackerManagerImplMock.h"
00034 #include "generated/TrackerManagerImplDriver.h"
00035 #include "Imports.cpp"
00036 
00037 namespace Protocols {
00038 namespace BitTorrent {
00039 namespace Trackers {
00040 namespace Testing {
00041 
00043 
00045 class TrackerManagerImplTest : public CppUnit::TestFixture
00046 {
00047     CPPUNIT_TEST_SUITE (TrackerManagerImplTest);
00048     CPPUNIT_TEST (testStartTrackerManager);
00049     CPPUNIT_TEST (testSessionErrorWhileWaitingForSessionEstablishment);
00050     CPPUNIT_TEST (testSessionEstablishedWhileWaitingForSessionEstablishment);
00051     CPPUNIT_TEST (testResponseRecievedWhileWaitingForResponse);
00052     CPPUNIT_TEST (testUpdateTimeHasCome);
00053     CPPUNIT_TEST (testStopStoppedTrackerManager);
00054     CPPUNIT_TEST (testStopTrackerManagerWhileWaitingForSessionEstablishment);
00055     CPPUNIT_TEST (testStopTrackerManagerAfterRecievedResponse);
00056     CPPUNIT_TEST (testSessionClosingWhileWhileWaitingForResponse);
00057     CPPUNIT_TEST (testSessionClosingAfterRecievedResponse);
00058     CPPUNIT_TEST (testSessionClosedWhileWhileWaitingForResponse);
00059     CPPUNIT_TEST (testSessionClosedAfterRecievedResponse);
00060     CPPUNIT_TEST (testSessionClosedAfterStartedTrackerManagerIsStopped);
00061     CPPUNIT_TEST_SUITE_END();
00062 
00063     auto_ptr <TimerMock>                        timer;
00064     auto_ptr <TrackerRequestSessionMock>        trackerRequestSession;
00065     auto_ptr <TrackerRequestSessionFactoryMock> trackerRequestSessionFactory;
00066     auto_ptr <TrackerManagerStatusMock>         trackerManagerStatus;
00067     auto_ptr <TrackerManagerImpl>               trackerManagerReal;
00068     auto_ptr <TrackerManagerImplDriver>         trackerManager;
00069 
00070     Torrent                                     torrent;
00071     TrackerRequest                              trackerRequest;
00072     TrackerRequest                              updateTrackerRequest;
00073     TrackerResponse                             trackerResponse;
00074     QString                                     errorMessage;
00075 
00076 public:
00077     TrackerManagerImplTest();
00078 
00079     void setUp()
00080     {
00081         timer.reset (new TimerMock());
00082         trackerRequestSession.reset (new TrackerRequestSessionMock());
00083         trackerRequestSessionFactory.reset (
00084             new TrackerRequestSessionFactoryMock());
00085         trackerManagerStatus.reset (new TrackerManagerStatusMock());
00086         trackerManagerReal.reset (new TrackerManagerImpl (
00087             &trackerRequestSessionFactory->imp,
00088             &timer->imp,
00089             &trackerManagerStatus->imp));
00090         trackerManager.reset (new TrackerManagerImplDriver (
00091             *trackerManagerReal.get()));
00092     }
00093 
00094     void tearDown()
00095     {
00096         trackerManager.reset();
00097         trackerManagerReal.reset();
00098         trackerManagerStatus.reset();
00099         trackerRequestSessionFactory.reset();
00100         trackerRequestSession.reset();
00101         timer.reset();
00102     }
00103 
00109     void testStartTrackerManager()
00110     {
00111         call (trackerManager->start (torrent))
00112             .willCall (trackerRequestSessionFactory->createSession (torrent))
00113             .willReturn (&trackerRequestSession->imp)
00114             .willCall (trackerRequestSession->open())
00115             .returns()
00116         .returns();
00117     }
00118 
00123     void stateWaitingForSessionEstablishment()
00124     {
00125         testStartTrackerManager();
00126     }
00127 
00132     void testSessionErrorWhileWaitingForSessionEstablishment()
00133     {
00134         stateWaitingForSessionEstablishment();
00135 
00136         call (trackerManager->trackerRequestSessionFactorySessionError (
00137             &trackerRequestSession->imp, errorMessage))
00138             .willCall (trackerManagerStatus->trackerManagerError (
00139                 errorMessage))
00140             .returns()
00141         .returns();
00142     }
00143 
00148     void refHandleSessionEstablishment()
00149     {
00150         call (trackerManager->trackerRequestSessionFactorySessionEstablished (
00151             &trackerRequestSession->imp))
00152             .willCall (trackerRequestSession->sendRequest (trackerRequest))
00153             .returns()
00154         .returns();
00155     }
00156 
00161     void testSessionEstablishedWhileWaitingForSessionEstablishment()
00162     {
00163         stateWaitingForSessionEstablishment();
00164 
00165         refHandleSessionEstablishment();
00166     }
00167 
00172     void stateWaitingForResponse()
00173     {
00174         testSessionEstablishedWhileWaitingForSessionEstablishment();
00175     }
00176 
00181     void refHandleResponseReception()
00182     {
00183         call (trackerManager->trackerRequestSessionFactoryResponseRecieved (
00184             &trackerRequestSession->imp, trackerResponse))
00185             .willCall (timer->stop())
00186             .returns()
00187             .willCall (timer->start (0, trackerResponse.interval()))
00188             .returns()
00189             .willCall (trackerManagerStatus->trackerManagerFoundPeers (
00190                 trackerResponse.peers()))
00191             .returns()
00192         .returns();
00193     }
00194 
00199     void testResponseRecievedWhileWaitingForResponse()
00200     {
00201         stateWaitingForResponse();
00202 
00203         refHandleResponseReception();
00204     }
00205 
00210     void stateResponseRecieved()
00211     {
00212         testResponseRecievedWhileWaitingForResponse();
00213     }
00214 
00218     void testUpdateTimeHasCome()
00219     {
00220         stateResponseRecieved();
00221 
00222         call (trackerManager->updateTime())
00223             .willCall (timer->stop())
00224             .returns()
00225             .willCall (trackerRequestSession->sendRequest (updateTrackerRequest))
00226             .returns()
00227             .willCall (timer->start (0, trackerResponse.interval()))
00228             .returns()
00229         .returns();
00230     }
00231 
00236     void testStopStoppedTrackerManager()
00237     {
00238         call (trackerManager->stop())
00239             .willCall (timer->stop())
00240             .returns()
00241         .returns();
00242     }
00243 
00247     void refStopStartedTrackerManager()
00248     {
00249         call (trackerManager->stop())
00250             .willCall (timer->stop())
00251             .returns()
00252             .willCall (trackerRequestSession->close())
00253             .returns()
00254         .returns();
00255     }
00256 
00261     void testStopTrackerManagerWhileWaitingForSessionEstablishment()
00262     {
00263         stateWaitingForSessionEstablishment();
00264 
00265         refStopStartedTrackerManager();
00266     }
00267 
00268 
00273     void testStopTrackerManagerAfterRecievedResponse()
00274     {
00275         stateResponseRecieved();
00276 
00277         refStopStartedTrackerManager();
00278     }
00279 
00283     void refHandleSessionClosing()
00284     {
00285         call (trackerManager->trackerRequestSessionFactorySessionClosing (
00286             &trackerRequestSession->imp))
00287             .willCall (timer->stop())
00288             .returns()
00289         .returns();
00290     }
00291 
00296     void testSessionClosingWhileWhileWaitingForResponse()
00297     {
00298         stateWaitingForResponse();
00299 
00300         refHandleSessionClosing();
00301     }
00302 
00307     void testSessionClosingAfterRecievedResponse()
00308     {
00309         stateResponseRecieved();
00310 
00311         refHandleSessionClosing();
00312     }
00313 
00317     void refHandleSessionClosed()
00318     {
00319         call (trackerManager->trackerRequestSessionFactorySessionClosed (
00320             &trackerRequestSession->imp))
00321             .willCall (timer->stop())
00322             .returns()
00323             .willCall (trackerRequestSessionFactory->destroySession (
00324                 &trackerRequestSession->imp))
00325             .returns()
00326         .returns();
00327     }
00328 
00333     void testSessionClosedWhileWhileWaitingForResponse()
00334     {
00335         stateWaitingForResponse();
00336 
00337         refHandleSessionClosed();
00338     }
00339 
00344     void testSessionClosedAfterRecievedResponse()
00345     {
00346         stateResponseRecieved();
00347 
00348         refHandleSessionClosed();
00349     }
00350 
00355     void stateStoppedAfterStarted()
00356     {
00357         testStopTrackerManagerWhileWaitingForSessionEstablishment();
00358     }
00359 
00363     void testSessionClosedAfterStartedTrackerManagerIsStopped()
00364     {
00365         stateStoppedAfterStarted();
00366 
00367         refHandleSessionClosed();
00368     }
00369 };
00370 
00371 CPPUNIT_TEST_SUITE_REGISTRATION(TrackerManagerImplTest);
00372 
00374 TrackerManagerImplTest::TrackerManagerImplTest()
00375     : timer(), trackerRequestSession(), trackerRequestSessionFactory(),
00376       trackerManagerStatus(), trackerManagerReal(), trackerManager(),
00377       torrent(),
00378       trackerRequest (
00379         Uri::fromUnencoded ("http://localhost/announce.php"),
00380         PeerInfo ("1.2.3.4", 6881, PeerInfo::PeerId ("-CA0610-574938205849")),
00381         Torrent::InfoHash ("z53bf64bd05hfn2daqml"),
00382         4096,
00383         2048,
00384         63488,
00385         false,
00386         TrackerRequest::Empty,
00387         0,
00388         QByteArray(),
00389         QByteArray()),
00390       updateTrackerRequest  (
00391         Uri::fromUnencoded ("http://localhost/announce.php"),
00392         PeerInfo ("1.2.3.4", 6881, PeerInfo::PeerId ("-CA0610-574938205849")),
00393         Torrent::InfoHash ("z53bf64bd05hfn2daqml"),
00394         4096,
00395         2048,
00396         63488,
00397         false,
00398         TrackerRequest::Empty,
00399         0,
00400         QByteArray(),
00401         QByteArray ("x64gd0c8f1cz5dusm4gd")),
00402       trackerResponse(),
00403       errorMessage ("Error")
00404 {
00405     // trackerResponse
00406     const QByteArray rawResponseData (
00407         "d"
00408             "8:intervali360e"
00409             "10:tracker id20:x64gd0c8f1cz5dusm4gd"
00410             "5:peersle"
00411         "e");
00412     bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00413         rawResponseData, trackerResponse);
00414     CPPUNIT_ASSERT (loadedOk);
00415 }
00416 
00417 } // namespace Testing
00418 } // namespace Trackers
00419 } // namespace BitTorrent
00420 } // namespace Protocols