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 "../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
00109 foreach (QByteArray byte, ipAddress.split ('.')) {
00110 writer.writeByte (byte.toUShort());
00111 }
00112
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
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 }
01098 }
01099 }
01100 }