TrackerResponseParserTest.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 "../TrackerResponse.h"
00025 #include "../TrackerResponseParser.h"
00026 #include "Imports.cpp"
00027 #include <sstream>
00028 #include <limits>
00029 
00030 namespace Protocols {
00031 namespace BitTorrent {
00032 namespace Trackers {
00033 namespace Testing {
00034 
00036 
00038 class TrackerResponseParserTest : public CppUnit::TestFixture
00039 {
00040     CPPUNIT_TEST_SUITE (TrackerResponseParserTest);
00041     CPPUNIT_TEST (testLoadInvalidResponseEmptyData);
00042     CPPUNIT_TEST (testLoadInvalidResponseRandomData);
00043     CPPUNIT_TEST (testLoadInvalidResponseListInsteadOfDictionary);
00044     CPPUNIT_TEST (testLoadInvalidResponseEmptyDictionary);
00045     CPPUNIT_TEST (testLoadInvalidResponseWouldNotChangeInputResponseObject);
00046     CPPUNIT_TEST (testLoadFieldFailureReasonPresentAndOtherDataAsWell);
00047     CPPUNIT_TEST (testLoadFieldFailureReasonPresentAndNoOtherData);
00048     CPPUNIT_TEST (testLoadFieldWarningMessageValid);
00049     CPPUNIT_TEST (testLoadFieldIntervalNegative);
00050     CPPUNIT_TEST (testLoadFieldIntervalZero);
00051     CPPUNIT_TEST (testLoadFieldIntervalTooBig);
00052     CPPUNIT_TEST (testLoadFieldIntervalValid);
00053     CPPUNIT_TEST (testLoadFieldIntervalMissing);
00054     CPPUNIT_TEST (testLoadFieldMinIntervalNegative);
00055     CPPUNIT_TEST (testLoadFieldMinIntervalZero);
00056     CPPUNIT_TEST (testLoadFieldMinIntervalTooBig);
00057     CPPUNIT_TEST (testLoadFieldMinIntervalValid);
00058     CPPUNIT_TEST (testLoadFieldTrackerIdValid);
00059     CPPUNIT_TEST (testLoadFieldCompleteNegative);
00060     CPPUNIT_TEST (testLoadFieldCompleteZero);
00061     CPPUNIT_TEST (testLoadFieldCompleteTooBig);
00062     CPPUNIT_TEST (testLoadFieldCompleteValid);
00063     CPPUNIT_TEST (testLoadFieldIncompleteNegative);
00064     CPPUNIT_TEST (testLoadFieldIncompleteZero);
00065     CPPUNIT_TEST (testLoadFieldIncompleteTooBig);
00066     CPPUNIT_TEST (testLoadFieldIncompleteValid);
00067     CPPUNIT_TEST (testLoadFieldPeersMissing);
00068     CPPUNIT_TEST (testLoadFieldPeersIntInsteadOfDictionary);
00069     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelEmptyList);
00070     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPeerIdMissing);
00071     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPeerIdInvalid);
00072     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoIpMissing);
00073     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPortMissing);
00074     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPortNegative);
00075     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPortZero);
00076     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPortTooBig);
00077     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelOnePeerInfoPortValid);
00078     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelTwoPeerInfoEverythingValid);
00079     CPPUNIT_TEST (testLoadFieldPeersDictionaryModelTwoPeerInfoSecondInvalid);
00080     CPPUNIT_TEST (testLoadFieldPeersBinaryModelOnePeerInfoStringTooShort);
00081     CPPUNIT_TEST (testLoadFieldPeersBinaryModelOnePeerInfoStringTooLong);
00082     CPPUNIT_TEST (testLoadFieldPeersBinaryModelOnePeerInfoEverythingValid);
00083     CPPUNIT_TEST (testLoadFieldPeersBinaryModelTwoPeerInfoEverythingValid);
00084     CPPUNIT_TEST (testLoadValidResponseMinimal);
00085     CPPUNIT_TEST (testLoadValidResponseComplex);
00086     CPPUNIT_TEST_SUITE_END();
00087 
00089     template <class T>
00090     static QByteArray stringifyNum (T num)
00091     {
00092         std::ostringstream out;
00093         out << num;
00094         return QByteArray (out.str().c_str());
00095     }
00096 
00098 
00104     static QByteArray createPeersBinaryModel (const QByteArray &ipAddress,
00105                                               quint16 port)
00106     {
00107         BinaryWriter writer (BinaryWriter::BigEndian);
00108         // Write IP address
00109         foreach (QByteArray byte, ipAddress.split ('.')) {
00110             writer.writeByte (byte.toUShort());
00111         }
00112         // Write port
00113         writer.writeUInt16 (port);
00114 
00115         return writer.buffer();
00116     }
00117 
00118 public:
00122     void testLoadInvalidResponseEmptyData()
00123     {
00124         const QByteArray rawResponseData ("");
00125         TrackerResponse response;
00126         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00127             rawResponseData, response);
00128         CPPUNIT_ASSERT (!loadedOk);
00129     }
00130 
00135     void testLoadInvalidResponseRandomData()
00136     {
00137         const QByteArray rawResponseData ("!@#$%^&*()_+");
00138         TrackerResponse response;
00139         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00140             rawResponseData, response);
00141         CPPUNIT_ASSERT (!loadedOk);
00142     }
00143 
00148     void testLoadInvalidResponseListInsteadOfDictionary()
00149     {
00150         const QByteArray rawResponseData ("le");
00151         TrackerResponse response;
00152         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00153             rawResponseData, response);
00154         CPPUNIT_ASSERT (!loadedOk);
00155     }
00156 
00161     void testLoadInvalidResponseEmptyDictionary()
00162     {
00163         const QByteArray rawResponseData ("de");
00164         TrackerResponse response;
00165         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00166             rawResponseData, response);
00167         CPPUNIT_ASSERT (!loadedOk);
00168     }
00169 
00173     void testLoadInvalidResponseWouldNotChangeInputResponseObject()
00174     {
00175         const QByteArray rawResponseDataValid (
00176             "d"
00177                 "14:failure reason6:Failed"
00178             "e");
00179         TrackerResponse response;
00180         bool loadedOk1 = TrackerResponseParser::parseAndLoadTrackerResponse (
00181             rawResponseDataValid, response);
00182         CPPUNIT_ASSERT (loadedOk1);
00183 
00184         const QByteArray rawResponseDataInvalid ("463gd972nedlsdf023e");
00185         TrackerResponse responseBackup (response);
00186         bool loadedOk2 = TrackerResponseParser::parseAndLoadTrackerResponse (
00187             rawResponseDataInvalid, response);
00188         CPPUNIT_ASSERT (!loadedOk2);
00189         CPPUNIT_ASSERT (responseBackup == response);
00190     }
00191 
00196     void testLoadFieldFailureReasonPresentAndOtherDataAsWell()
00197     {
00198         const QByteArray rawResponseData (
00199             "d"
00200                 "14:failure reason6:Failed"
00201                 "8:intervali300e"
00202                 "5:peersle"
00203             "e");
00204         TrackerResponse response;
00205         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00206             rawResponseData, response);
00207         CPPUNIT_ASSERT (!loadedOk);
00208     }
00209 
00214     void testLoadFieldFailureReasonPresentAndNoOtherData()
00215     {
00216         const QByteArray rawResponseData (
00217             "d"
00218                 "14:failure reason6:Failed"
00219             "e");
00220         TrackerResponse response;
00221         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00222             rawResponseData, response);
00223         CPPUNIT_ASSERT (loadedOk);
00224         CPPUNIT_ASSERT (response.failureReason() == QString ("Failed"));
00225         // Other data are left unchanged
00226         CPPUNIT_ASSERT (response.warningMessage() == QString());
00227         CPPUNIT_ASSERT (response.interval() == 0);
00228         CPPUNIT_ASSERT (response.minInterval() == 0);
00229         CPPUNIT_ASSERT (response.trackerId() == QByteArray());
00230         CPPUNIT_ASSERT (response.complete() == 0);
00231         CPPUNIT_ASSERT (response.incomplete() == 0);
00232         CPPUNIT_ASSERT (response.peers() == TrackerResponse::PeerInfoList());
00233     }
00234 
00238     void testLoadFieldWarningMessageValid()
00239     {
00240         const QByteArray rawResponseData (
00241             "d"
00242                 "15:warning message7:Warning"
00243                 "8:intervali300e"
00244                 "5:peersle"
00245             "e");
00246         TrackerResponse response;
00247         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00248             rawResponseData, response);
00249         CPPUNIT_ASSERT (loadedOk);
00250         CPPUNIT_ASSERT (response.warningMessage() == QString ("Warning"));
00251     }
00252 
00257     void testLoadFieldIntervalMissing()
00258     {
00259         const QByteArray rawResponseData (
00260             "d"
00261                 "5:peersle"
00262             "e");
00263         TrackerResponse response;
00264         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00265             rawResponseData, response);
00266         CPPUNIT_ASSERT (!loadedOk);
00267     }
00268 
00273     void testLoadFieldIntervalNegative()
00274     {
00275         const QByteArray rawResponseData (
00276             "d"
00277                 "8:intervali-126e"
00278                 "5:peersle"
00279             "e");
00280         TrackerResponse response;
00281         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00282             rawResponseData, response);
00283         CPPUNIT_ASSERT (!loadedOk);
00284     }
00285 
00290     void testLoadFieldIntervalZero()
00291     {
00292         const QByteArray rawResponseData (
00293             "d"
00294                 "8:intervali0e"
00295                 "5:peersle"
00296             "e");
00297         TrackerResponse response;
00298         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00299             rawResponseData, response);
00300         CPPUNIT_ASSERT (loadedOk);
00301         CPPUNIT_ASSERT (response.interval() == 0);
00302     }
00303 
00308     void testLoadFieldIntervalTooBig()
00309     {
00310         const QByteArray rawResponseData (
00311             "d"
00312                 "8:intervali" + stringifyNum(std::numeric_limits<qint64>::max()) + "e"
00313                 "5:peersle"
00314             "e");
00315         TrackerResponse response;
00316         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00317             rawResponseData, response);
00318         CPPUNIT_ASSERT (!loadedOk);
00319     }
00320 
00324     void testLoadFieldIntervalValid()
00325     {
00326         const QByteArray rawResponseData (
00327             "d"
00328                 "8:intervali300e"
00329                 "5:peersle"
00330             "e");
00331         TrackerResponse response;
00332         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00333             rawResponseData, response);
00334         CPPUNIT_ASSERT (loadedOk);
00335         CPPUNIT_ASSERT (response.interval() == 300);
00336     }
00337 
00342     void testLoadFieldMinIntervalNegative()
00343     {
00344         const QByteArray rawResponseData (
00345             "d"
00346                 "8:intervali400e"
00347                 "12:min intervali-477e"
00348                 "5:peersle"
00349             "e");
00350         TrackerResponse response;
00351         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00352             rawResponseData, response);
00353         CPPUNIT_ASSERT (loadedOk);
00354         CPPUNIT_ASSERT (response.minInterval() == 0);
00355     }
00356 
00361     void testLoadFieldMinIntervalZero()
00362     {
00363         const QByteArray rawResponseData (
00364             "d"
00365                 "8:intervali400e"
00366                 "12:min intervali0e"
00367                 "5:peersle"
00368             "e");
00369         TrackerResponse response;
00370         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00371             rawResponseData, response);
00372         CPPUNIT_ASSERT (loadedOk);
00373         CPPUNIT_ASSERT (response.minInterval() == 0);
00374     }
00375 
00380     void testLoadFieldMinIntervalTooBig()
00381     {
00382         const QByteArray rawResponseData (
00383             "d"
00384                 "8:intervali400e"
00385                 "12:min intervali" + stringifyNum(std::numeric_limits<qint64>::max()) + "e"
00386                 "5:peersle"
00387             "e");
00388         TrackerResponse response;
00389         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00390             rawResponseData, response);
00391         CPPUNIT_ASSERT (loadedOk);
00392         CPPUNIT_ASSERT (response.minInterval() == 0);
00393     }
00394 
00398     void testLoadFieldMinIntervalValid()
00399     {
00400         const QByteArray rawResponseData (
00401             "d"
00402                 "8:intervali400e"
00403                 "12:min intervali600e"
00404                 "5:peersle"
00405             "e");
00406         TrackerResponse response;
00407         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00408             rawResponseData, response);
00409         CPPUNIT_ASSERT (loadedOk);
00410         CPPUNIT_ASSERT (response.minInterval() == 600);
00411     }
00412 
00416     void testLoadFieldTrackerIdValid()
00417     {
00418         const QByteArray rawResponseData (
00419             "d"
00420                 "8:intervali300e"
00421                 "10:tracker id20:dg47sk3ld06jvnzmaq23"
00422                 "8:completei10e"
00423                 "10:incompletei20e"
00424                 "5:peersle"
00425             "e");
00426         TrackerResponse response;
00427         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00428             rawResponseData, response);
00429         CPPUNIT_ASSERT (loadedOk);
00430         CPPUNIT_ASSERT (response.trackerId() == QString ("dg47sk3ld06jvnzmaq23"));
00431     }
00432 
00437     void testLoadFieldCompleteNegative()
00438     {
00439         const QByteArray rawResponseData (
00440             "d"
00441                 "8:intervali300e"
00442                 "8:completei-1000e"
00443                 "5:peersle"
00444             "e");
00445         TrackerResponse response;
00446         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00447             rawResponseData, response);
00448         CPPUNIT_ASSERT (loadedOk);
00449         CPPUNIT_ASSERT (response.complete() == 0);
00450     }
00451 
00456     void testLoadFieldCompleteZero()
00457     {
00458         const QByteArray rawResponseData (
00459             "d"
00460                 "8:intervali300e"
00461                 "8:completei0e"
00462                 "5:peersle"
00463             "e");
00464         TrackerResponse response;
00465         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00466             rawResponseData, response);
00467         CPPUNIT_ASSERT (loadedOk);
00468         CPPUNIT_ASSERT (response.complete() == 0);
00469     }
00470 
00475     void testLoadFieldCompleteTooBig()
00476     {
00477         const QByteArray rawResponseData (
00478             "d"
00479                 "8:intervali300e"
00480                 "8:completei" + stringifyNum(std::numeric_limits<qint64>::max()) + "e"
00481                 "5:peersle"
00482             "e");
00483         TrackerResponse response;
00484         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00485             rawResponseData, response);
00486         CPPUNIT_ASSERT (loadedOk);
00487         CPPUNIT_ASSERT (response.complete() == 0);
00488     }
00489 
00493     void testLoadFieldCompleteValid()
00494     {
00495         const QByteArray rawResponseData (
00496             "d"
00497                 "8:intervali300e"
00498                 "8:completei123e"
00499                 "5:peersle"
00500             "e");
00501         TrackerResponse response;
00502         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00503             rawResponseData, response);
00504         CPPUNIT_ASSERT (loadedOk);
00505         CPPUNIT_ASSERT (response.complete() == 123);
00506     }
00507 
00512     void testLoadFieldIncompleteNegative()
00513     {
00514         const QByteArray rawResponseData (
00515             "d"
00516                 "8:intervali300e"
00517                 "10:incompletei-16432e"
00518                 "5:peersle"
00519             "e");
00520         TrackerResponse response;
00521         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00522             rawResponseData, response);
00523         CPPUNIT_ASSERT (loadedOk);
00524         CPPUNIT_ASSERT (response.incomplete() == 0);
00525     }
00526 
00531     void testLoadFieldIncompleteZero()
00532     {
00533         const QByteArray rawResponseData (
00534             "d"
00535                 "8:intervali300e"
00536                 "8:completei123e"
00537                 "10:incompletei0e"
00538                 "5:peersle"
00539             "e");
00540         TrackerResponse response;
00541         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00542             rawResponseData, response);
00543         CPPUNIT_ASSERT (loadedOk);
00544         CPPUNIT_ASSERT (response.incomplete() == 0);
00545     }
00546 
00551     void testLoadFieldIncompleteTooBig()
00552     {
00553         const QByteArray rawResponseData (
00554             "d"
00555                 "8:intervali300e"
00556                 "10:incompletei" + stringifyNum(std::numeric_limits<qint64>::max()) + "e"
00557                 "5:peersle"
00558             "e");
00559         TrackerResponse response;
00560         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00561             rawResponseData, response);
00562         CPPUNIT_ASSERT (loadedOk);
00563         CPPUNIT_ASSERT (response.incomplete() == 0);
00564     }
00565 
00569     void testLoadFieldIncompleteValid()
00570     {
00571         const QByteArray rawResponseData (
00572             "d"
00573                 "8:intervali300e"
00574                 "10:incompletei1999e"
00575                 "5:peersle"
00576             "e");
00577         TrackerResponse response;
00578         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00579             rawResponseData, response);
00580         CPPUNIT_ASSERT (loadedOk);
00581         CPPUNIT_ASSERT (response.incomplete() == 1999);
00582     }
00583 
00588     void testLoadFieldPeersMissing()
00589     {
00590         const QByteArray rawResponseData (
00591             "d"
00592                 "8:intervali300e"
00593             "e");
00594         TrackerResponse response;
00595         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00596             rawResponseData, response);
00597         CPPUNIT_ASSERT (!loadedOk);
00598     }
00599 
00604     void testLoadFieldPeersIntInsteadOfDictionary()
00605     {
00606         const QByteArray rawResponseData (
00607             "d"
00608                 "8:intervali300e"
00609                 "5:peersli456ee"
00610             "e");
00611         TrackerResponse response;
00612         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00613             rawResponseData, response);
00614         CPPUNIT_ASSERT (!loadedOk);
00615     }
00616 
00621     void testLoadFieldPeersDictionaryModelEmptyList()
00622     {
00623         const QByteArray rawResponseData (
00624             "d"
00625                 "8:intervali300e"
00626                 "5:peersle"
00627             "e");
00628         TrackerResponse response;
00629         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00630             rawResponseData, response);
00631         CPPUNIT_ASSERT (loadedOk);
00632         CPPUNIT_ASSERT (response.peers() == TrackerResponse::PeerInfoList());
00633     }
00634 
00640     void testLoadFieldPeersDictionaryModelOnePeerInfoPeerIdMissing()
00641     {
00642         const QByteArray rawResponseData (
00643             "d"
00644                 "8:intervali300e"
00645                 "5:peers"
00646                     "l"
00647                         "d"
00648                             "2:ip9:127.0.0.1"
00649                             "4:porti6881e"
00650                         "e"
00651                     "e"
00652             "e");
00653         TrackerResponse response;
00654         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00655             rawResponseData, response);
00656         CPPUNIT_ASSERT (loadedOk);
00657         CPPUNIT_ASSERT (response.peers() == TrackerResponse::PeerInfoList());
00658     }
00659 
00665     void testLoadFieldPeersDictionaryModelOnePeerInfoPeerIdInvalid()
00666     {
00667         const QByteArray rawResponseData (
00668             "d"
00669                 "8:intervali300e"
00670                 "5:peers"
00671                     "l"
00672                         "d"
00673                             "7:peer id5:abcde"
00674                             "2:ip9:127.0.0.1"
00675                             "4:porti6881e"
00676                         "e"
00677                     "e"
00678             "e");
00679         TrackerResponse response;
00680         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00681             rawResponseData, response);
00682         CPPUNIT_ASSERT (loadedOk);
00683         TrackerResponse::PeerInfoList referencePeers;
00684         referencePeers.push_back (PeerInfo ("127.0.0.1", 6881,
00685             PeerInfo::PeerId()));
00686         CPPUNIT_ASSERT (response.peers() == referencePeers);
00687     }
00688 
00694     void testLoadFieldPeersDictionaryModelOnePeerInfoIpMissing()
00695     {
00696         const QByteArray rawResponseData (
00697             "d"
00698                 "8:intervali300e"
00699                 "5:peers"
00700                     "l"
00701                         "d"
00702                             "7:peer id20:agd538x9fo4bf85jg076"
00703                             "4:porti6881e"
00704                         "e"
00705                     "e"
00706             "e");
00707         TrackerResponse response;
00708         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00709             rawResponseData, response);
00710         CPPUNIT_ASSERT (loadedOk);
00711         CPPUNIT_ASSERT (response.peers() == TrackerResponse::PeerInfoList());
00712     }
00713 
00719     void testLoadFieldPeersDictionaryModelOnePeerInfoPortMissing()
00720     {
00721         const QByteArray rawResponseData (
00722             "d"
00723                 "8:intervali300e"
00724                 "5:peers"
00725                     "l"
00726                         "d"
00727                             "7:peer id20:agd538x9fo4bf85jg076"
00728                             "2:ip9:127.0.0.1"
00729                         "e"
00730                     "e"
00731             "e");
00732         TrackerResponse response;
00733         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00734             rawResponseData, response);
00735         CPPUNIT_ASSERT (loadedOk);
00736         CPPUNIT_ASSERT (response.peers() == TrackerResponse::PeerInfoList());
00737     }
00738 
00744     void testLoadFieldPeersDictionaryModelOnePeerInfoPortNegative()
00745     {
00746         const QByteArray rawResponseData (
00747             "d"
00748                 "8:intervali300e"
00749                 "5:peers"
00750                     "l"
00751                         "d"
00752                             "7:peer id20:agd538x9fo4bf85jg076"
00753                             "2:ip9:127.0.0.1"
00754                             "4:porti-1001e"
00755                         "e"
00756                     "e"
00757             "e");
00758         TrackerResponse response;
00759 
00760         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00761             rawResponseData, response);
00762         CPPUNIT_ASSERT (loadedOk);
00763         TrackerResponse::PeerInfoList referencePeers;
00764         referencePeers.push_back (PeerInfo ("127.0.0.1", 0,
00765             PeerInfo::PeerId ("agd538x9fo4bf85jg076")));
00766         CPPUNIT_ASSERT (response.peers() == referencePeers);
00767     }
00768 
00773     void testLoadFieldPeersDictionaryModelOnePeerInfoPortZero()
00774     {
00775         const QByteArray rawResponseData (
00776             "d"
00777                 "8:intervali300e"
00778                 "5:peers"
00779                     "l"
00780                         "d"
00781                             "7:peer id20:agd538x9fo4bf85jg076"
00782                             "2:ip9:127.0.0.1"
00783                             "4:porti0e"
00784                         "e"
00785                     "e"
00786             "e");
00787         TrackerResponse response;
00788         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00789             rawResponseData, response);
00790         CPPUNIT_ASSERT (loadedOk);
00791         TrackerResponse::PeerInfoList referencePeers;
00792         referencePeers.push_back (PeerInfo ("127.0.0.1", 0,
00793             PeerInfo::PeerId ("agd538x9fo4bf85jg076")));
00794         CPPUNIT_ASSERT (response.peers() == referencePeers);
00795     }
00796 
00802     void testLoadFieldPeersDictionaryModelOnePeerInfoPortTooBig()
00803     {
00804         const QByteArray rawResponseData (
00805             "d"
00806                 "8:intervali300e"
00807                 "5:peers"
00808                     "l"
00809                         "d"
00810                             "7:peer id20:agd538x9fo4bf85jg076"
00811                             "2:ip9:127.0.0.1"
00812                             "4:porti-1001e"
00813                         "e"
00814                     "e"
00815             "e");
00816         TrackerResponse response;
00817         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00818             rawResponseData, response);
00819                 CPPUNIT_ASSERT (loadedOk);
00820         TrackerResponse::PeerInfoList referencePeers;
00821         referencePeers.push_back (PeerInfo ("127.0.0.1", 0,
00822             PeerInfo::PeerId ("agd538x9fo4bf85jg076")));
00823         CPPUNIT_ASSERT (response.peers() == referencePeers);
00824     }
00825 
00830     void testLoadFieldPeersDictionaryModelOnePeerInfoPortValid()
00831     {
00832         const QByteArray rawResponseData (
00833             "d"
00834                 "8:intervali300e"
00835                 "5:peers"
00836                     "l"
00837                         "d"
00838                             "7:peer id20:agd538x9fo4bf85jg076"
00839                             "2:ip9:127.0.0.1"
00840                             "4:porti6881e"
00841                         "e"
00842                     "e"
00843             "e");
00844         TrackerResponse response;
00845         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00846             rawResponseData, response);
00847         CPPUNIT_ASSERT (loadedOk);
00848         TrackerResponse::PeerInfoList referencePeers;
00849         referencePeers.push_back (PeerInfo ("127.0.0.1", 6881,
00850             PeerInfo::PeerId ("agd538x9fo4bf85jg076")));
00851         CPPUNIT_ASSERT (response.peers() == referencePeers);
00852     }
00853 
00858     void testLoadFieldPeersDictionaryModelTwoPeerInfoEverythingValid()
00859     {
00860         const QByteArray rawResponseData (
00861             "d"
00862                 "8:intervali300e"
00863                 "5:peers"
00864                     "l"
00865                         "d"
00866                             "7:peer id20:ah453vx05lf85j362fx1"
00867                             "2:ip9:127.0.0.0"
00868                             "4:porti6880e"
00869                         "e"
00870                         "d"
00871                             "7:peer id20:f54hx439s0gnv8787714"
00872                             "2:ip9:127.0.0.1"
00873                             "4:porti6881e"
00874                         "e"
00875                     "e"
00876             "e");
00877         TrackerResponse response;
00878         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00879             rawResponseData, response);
00880         CPPUNIT_ASSERT (loadedOk);
00881         TrackerResponse::PeerInfoList referencePeers;
00882         referencePeers.push_back (PeerInfo ("127.0.0.0", 6880,
00883             PeerInfo::PeerId ("ah453vx05lf85j362fx1")));
00884         referencePeers.push_back (PeerInfo ("127.0.0.1", 6881,
00885             PeerInfo::PeerId ("f54hx439s0gnv8787714")));
00886         CPPUNIT_ASSERT (response.peers() == referencePeers);
00887     }
00888 
00894     void testLoadFieldPeersDictionaryModelTwoPeerInfoSecondInvalid()
00895     {
00896         const QByteArray rawResponseData (
00897             "d"
00898                 "8:intervali300e"
00899                 "5:peers"
00900                     "l"
00901                         "d"
00902                             "7:peer id20:ah453vx05lf85j362fx1"
00903                             "2:ip9:127.0.0.0"
00904                             "4:porti6880e"
00905                         "e"
00906                         "d"
00907                             "4:porti6881e"
00908                         "e"
00909                     "e"
00910             "e");
00911         TrackerResponse response;
00912         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00913             rawResponseData, response);
00914         CPPUNIT_ASSERT (loadedOk);
00915         TrackerResponse::PeerInfoList referencePeers;
00916         referencePeers.push_back (PeerInfo ("127.0.0.0", 6880,
00917             PeerInfo::PeerId ("ah453vx05lf85j362fx1")));
00918         CPPUNIT_ASSERT (response.peers() == referencePeers);
00919     }
00920 
00925     void testLoadFieldPeersBinaryModelOnePeerInfoStringTooShort()
00926     {
00927         const QByteArray rawPeersData (createPeersBinaryModel (
00928             QByteArray (""), 6881));
00929         const QByteArray rawResponseData (
00930             "d"
00931                 "8:intervali300e"
00932                 "5:peers" + QByteArray::number (rawPeersData.size()) + ":" +
00933                     rawPeersData +
00934             "e");
00935         TrackerResponse response;
00936         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00937             rawResponseData, response);
00938         CPPUNIT_ASSERT (!loadedOk);
00939     }
00940 
00945     void testLoadFieldPeersBinaryModelOnePeerInfoStringTooLong()
00946     {
00947         const QByteArray rawPeersData (createPeersBinaryModel (
00948             QByteArray ("1.2.3.4.5"), 6881));
00949         const QByteArray rawResponseData (
00950             "d"
00951                 "8:intervali300e"
00952                 "5:peers" + QByteArray::number (rawPeersData.size()) + ":" +
00953                     rawPeersData +
00954             "e");
00955         TrackerResponse response;
00956         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00957             rawResponseData, response);
00958         CPPUNIT_ASSERT (!loadedOk);
00959     }
00960 
00965     void testLoadFieldPeersBinaryModelOnePeerInfoEverythingValid()
00966     {
00967         const QByteArray rawPeersData (createPeersBinaryModel (
00968             QByteArray ("127.0.0.1"), 6881));
00969         const QByteArray rawResponseData (
00970             "d"
00971                 "8:intervali300e"
00972                 "5:peers" + QByteArray::number (rawPeersData.size()) + ":" +
00973                     rawPeersData +
00974             "e");
00975         TrackerResponse response;
00976         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
00977             rawResponseData, response);
00978         CPPUNIT_ASSERT (loadedOk);
00979         TrackerResponse::PeerInfoList referencePeers;
00980         referencePeers.push_back (PeerInfo ("127.0.0.1", 6881,
00981             PeerInfo::PeerId()));
00982         CPPUNIT_ASSERT (response.peers() == referencePeers);
00983     }
00984 
00989     void testLoadFieldPeersBinaryModelTwoPeerInfoEverythingValid()
00990     {
00991         const QByteArray rawPeersData1 (createPeersBinaryModel (
00992             QByteArray ("167.234.8.123"), 101));
00993         const QByteArray rawPeersData2 (createPeersBinaryModel (
00994             QByteArray ("4.6.7.8"), 63456));
00995         const QByteArray rawResponseData (
00996             "d"
00997                 "8:intervali300e"
00998                 "5:peers" + QByteArray::number (rawPeersData1.size() +
00999                         rawPeersData2.size()) +
01000                     ":" +
01001                     rawPeersData1 + rawPeersData2 +
01002             "e");
01003         TrackerResponse response;
01004         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
01005             rawResponseData, response);
01006         CPPUNIT_ASSERT (loadedOk);
01007         TrackerResponse::PeerInfoList referencePeers;
01008         referencePeers.push_back (PeerInfo ("167.234.8.123", 101,
01009             PeerInfo::PeerId()));
01010         referencePeers.push_back (PeerInfo ("4.6.7.8", 63456,
01011             PeerInfo::PeerId()));
01012         CPPUNIT_ASSERT (response.peers() == referencePeers);
01013     }
01014 
01019     void testLoadValidResponseMinimal()
01020     {
01021         const QByteArray rawResponseData (
01022             "d"
01023                 "8:intervali360e"
01024                 "5:peersle"
01025             "e");
01026         TrackerResponse response;
01027         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
01028             rawResponseData, response);
01029         CPPUNIT_ASSERT (loadedOk);
01030         CPPUNIT_ASSERT (response.failureReason() == QString());
01031         CPPUNIT_ASSERT (response.warningMessage() == QString());
01032         CPPUNIT_ASSERT (response.interval() == 360);
01033         CPPUNIT_ASSERT (response.minInterval() == 0);
01034         CPPUNIT_ASSERT (response.trackerId() == QByteArray());
01035         CPPUNIT_ASSERT (response.complete() == 0);
01036         CPPUNIT_ASSERT (response.incomplete() == 0);
01037         CPPUNIT_ASSERT (response.peers() == TrackerResponse::PeerInfoList());
01038     }
01039 
01044     void testLoadValidResponseComplex()
01045     {
01046         const QByteArray rawResponseData (
01047             "d"
01048                 "15:warning message7:Warning"
01049                 "8:intervali300e"
01050                 "12:min intervali600e"
01051                 "10:tracker id20:dg47sk3ld06jvnzmaq23"
01052                 "8:completei10e"
01053                 "10:incompletei20e"
01054                 "5:peers"
01055                     "l"
01056                         "d"
01057                             "7:peer id20:agd538x9fo4bf85jg076"
01058                             "2:ip9:127.0.0.1"
01059                             "4:porti6881e"
01060                         "e"
01061                         "d"
01062                             "7:peer id20:hf648dnck60dktuydnsf"
01063                             "2:ip9:127.0.0.2"
01064                             "4:porti6882e"
01065                         "e"
01066                         "d"
01067                             "7:peer id20:lop0r64gcvxg35dhsb2l"
01068                             "2:ip9:127.0.0.3"
01069                             "4:porti6883e"
01070                         "e"
01071                     "e"
01072             "e");
01073         TrackerResponse response;
01074         bool loadedOk = TrackerResponseParser::parseAndLoadTrackerResponse (
01075             rawResponseData, response);
01076         CPPUNIT_ASSERT (loadedOk);
01077         CPPUNIT_ASSERT (response.failureReason() == QString());
01078         CPPUNIT_ASSERT (response.warningMessage() == QString("Warning"));
01079         CPPUNIT_ASSERT (response.interval() == 300);
01080         CPPUNIT_ASSERT (response.minInterval() == 600);
01081         CPPUNIT_ASSERT (response.trackerId() == QByteArray("dg47sk3ld06jvnzmaq23"));
01082         CPPUNIT_ASSERT (response.complete() == 10);
01083         CPPUNIT_ASSERT (response.incomplete() == 20);
01084         TrackerResponse::PeerInfoList referencePeers;
01085         referencePeers.push_back (PeerInfo ("127.0.0.1", 6881,
01086             PeerInfo::PeerId ("agd538x9fo4bf85jg076")));
01087         referencePeers.push_back (PeerInfo ("127.0.0.2", 6882,
01088             PeerInfo::PeerId ("hf648dnck60dktuydnsf")));
01089         referencePeers.push_back (PeerInfo ("127.0.0.3", 6883,
01090             PeerInfo::PeerId ("lop0r64gcvxg35dhsb2l")));
01091         CPPUNIT_ASSERT (response.peers() == referencePeers);
01092     }
01093 };
01094 
01095 CPPUNIT_TEST_SUITE_REGISTRATION(TrackerResponseParserTest);
01096 
01097 } // namespace Testing
01098 } // namespace Trackers
01099 } // namespace BitTorrent
01100 } // namespace Protocols