TrackerManagerImplTest.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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 }
00418 }
00419 }
00420 }