Browse Source

2007-12-10 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>

	Fixed the bug: only first announce URL is tried in AnnounceTier,
	in stopped and completed event.
	* src/AnnounceList.{h, cc}
	* test/AnnounceListTest.cc
	* src/DefaultBtAnnounce.cc
	* test/DefaultBtAnnounceTest.cc

	Sorted URLs.
	* test/Metalink2RequestGroupTest.cc
Tatsuhiro Tsujikawa 18 năm trước cách đây
mục cha
commit
b482568d59

+ 12 - 0
ChangeLog

@@ -1,3 +1,15 @@
+2007-12-10  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
+
+	Fixed the bug: only first announce URL is tried in AnnounceTier,
+	in stopped and completed event.
+	* src/AnnounceList.{h, cc}
+	* test/AnnounceListTest.cc
+	* src/DefaultBtAnnounce.cc
+	* test/DefaultBtAnnounceTest.cc
+
+	Sorted URLs.
+	* test/Metalink2RequestGroupTest.cc
+
 2007-12-09  Tatsuhiro Tsujikawa  <tujikawa at rednoah dot com>
 
 	Removed unnecessary string copy. Updated doc and corrected indentation.

+ 18 - 0
src/AnnounceList.cc

@@ -237,3 +237,21 @@ void AnnounceList::resetTier()
 {
   resetIterator();
 }
+
+bool AnnounceList::currentTierAcceptsStoppedEvent() const
+{
+  if(currentTrackerInitialized) {
+    return FindStoppedAllowedTier()(*currentTier);
+  } else {
+    return false;
+  }
+}
+
+bool AnnounceList::currentTierAcceptsCompletedEvent() const
+{
+  if(currentTrackerInitialized) {
+    return FindCompletedAllowedTier()(*currentTier);
+  } else {
+    return false;
+  }
+}

+ 4 - 0
src/AnnounceList.h

@@ -119,6 +119,10 @@ public:
   bool allTiersFailed() const;
 
   void resetTier();
+
+  bool currentTierAcceptsStoppedEvent() const;
+
+  bool currentTierAcceptsCompletedEvent() const;
 };
 
 #endif // _D_ANNOUNCE_LIST_H_

+ 6 - 2
src/DefaultBtAnnounce.cc

@@ -100,10 +100,14 @@ bool DefaultBtAnnounce::isAnnounceReady() {
 
 string DefaultBtAnnounce::getAnnounceUrl() {
   if(isStoppedAnnounceReady()) {
-    announceList.moveToStoppedAllowedTier();
+    if(!announceList.currentTierAcceptsStoppedEvent()) {
+      announceList.moveToStoppedAllowedTier();
+    }
     announceList.setEvent(AnnounceTier::STOPPED);
   } else if(isCompletedAnnounceReady()) {
-    announceList.moveToCompletedAllowedTier();
+    if(!announceList.currentTierAcceptsCompletedEvent()) {
+      announceList.moveToCompletedAllowedTier();
+    }
     announceList.setEvent(AnnounceTier::COMPLETED);
   } else if(isDefaultAnnounceReady()) {
     // If download completed before "started" event is sent to a tracker,

+ 6 - 0
test/AnnounceListTest.cc

@@ -270,10 +270,13 @@ void AnnounceListTest::testMoveToStoppedAllowedTier() {
 
   AnnounceList announceList(tiers);
 
+  CPPUNIT_ASSERT(!announceList.currentTierAcceptsStoppedEvent());
   CPPUNIT_ASSERT_EQUAL(string("tracker1"), announceList.getAnnounce());
   announceList.moveToStoppedAllowedTier();
+  CPPUNIT_ASSERT(announceList.currentTierAcceptsStoppedEvent());
   CPPUNIT_ASSERT_EQUAL(string("tracker2"), announceList.getAnnounce());
   announceList.announceFailure();
+  CPPUNIT_ASSERT(!announceList.currentTierAcceptsStoppedEvent());
   CPPUNIT_ASSERT_EQUAL(string("tracker3"), announceList.getAnnounce());
   // test wrapped search
   announceList.moveToStoppedAllowedTier();
@@ -293,10 +296,13 @@ void AnnounceListTest::testMoveToCompletedAllowedTier() {
 
   AnnounceList announceList(tiers);
 
+  CPPUNIT_ASSERT(!announceList.currentTierAcceptsCompletedEvent());
   CPPUNIT_ASSERT_EQUAL(string("tracker1"), announceList.getAnnounce());
   announceList.moveToStoppedAllowedTier();
+  CPPUNIT_ASSERT(announceList.currentTierAcceptsCompletedEvent());
   CPPUNIT_ASSERT_EQUAL(string("tracker2"), announceList.getAnnounce());
   announceList.announceFailure();
+  CPPUNIT_ASSERT(!announceList.currentTierAcceptsCompletedEvent());
   CPPUNIT_ASSERT_EQUAL(string("tracker3"), announceList.getAnnounce());
   // test wrapped search
   announceList.moveToStoppedAllowedTier();

+ 64 - 0
test/DefaultBtAnnounceTest.cc

@@ -19,6 +19,8 @@ class DefaultBtAnnounceTest:public CppUnit::TestFixture {
   CPPUNIT_TEST(testGetAnnounceUrl);
   CPPUNIT_TEST(testNoMoreAnnounce);
   CPPUNIT_TEST(testIsAllAnnounceFailed);
+  CPPUNIT_TEST(testURLOrderInStoppedEvent);
+  CPPUNIT_TEST(testURLOrderInCompletedEvent);
   CPPUNIT_TEST_SUITE_END();
 private:
   MockBtContextHandle _btContext;
@@ -74,6 +76,8 @@ public:
   void testGetAnnounceUrl();
   void testNoMoreAnnounce();
   void testIsAllAnnounceFailed();
+  void testURLOrderInStoppedEvent();
+  void testURLOrderInCompletedEvent();
 };
 
 
@@ -211,3 +215,63 @@ void DefaultBtAnnounceTest::testIsAllAnnounceFailed()
 
   CPPUNIT_ASSERT(!btAnnounce.isAllAnnounceFailed());  
 }
+
+void DefaultBtAnnounceTest::testURLOrderInStoppedEvent()
+{
+  const char* urls[] = { "http://localhost1/announce",
+			 "http://localhost2/announce" };
+  AnnounceTierHandle announceTier = new AnnounceTier(Strings(&urls[0], &urls[2]));
+
+  _btContext->addAnnounceTier(announceTier);
+
+  DefaultBtAnnounce btAnnounce(_btContext, _option);
+  btAnnounce.setPieceStorage(_pieceStorage);
+  btAnnounce.setPeerStorage(_peerStorage);
+  btAnnounce.setBtRuntime(_btRuntime);
+  btAnnounce.setRandomizer(new FixedNumberRandomizer());
+  btAnnounce.generateKey();
+
+  CPPUNIT_ASSERT_EQUAL(string("http://localhost1/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started"), btAnnounce.getAnnounceUrl());
+
+  btAnnounce.announceSuccess();
+
+  _btRuntime->setHalt(true);
+
+  CPPUNIT_ASSERT_EQUAL(string("http://localhost1/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped"), btAnnounce.getAnnounceUrl());
+
+  btAnnounce.announceFailure();
+
+  CPPUNIT_ASSERT_EQUAL(string("http://localhost2/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=0&no_peer_id=1&port=6989&event=stopped"), btAnnounce.getAnnounceUrl());
+
+  btAnnounce.announceSuccess();
+}
+
+void DefaultBtAnnounceTest::testURLOrderInCompletedEvent()
+{
+  const char* urls[] = { "http://localhost1/announce",
+			 "http://localhost2/announce" };
+  AnnounceTierHandle announceTier = new AnnounceTier(Strings(&urls[0], &urls[2]));
+
+  _btContext->addAnnounceTier(announceTier);
+
+  DefaultBtAnnounce btAnnounce(_btContext, _option);
+  btAnnounce.setPieceStorage(_pieceStorage);
+  btAnnounce.setPeerStorage(_peerStorage);
+  btAnnounce.setBtRuntime(_btRuntime);
+  btAnnounce.setRandomizer(new FixedNumberRandomizer());
+  btAnnounce.generateKey();
+
+  CPPUNIT_ASSERT_EQUAL(string("http://localhost1/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=started"), btAnnounce.getAnnounceUrl());
+
+  btAnnounce.announceSuccess();
+
+  _pieceStorage->setAllDownloadFinished(true);
+
+  CPPUNIT_ASSERT_EQUAL(string("http://localhost1/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed"), btAnnounce.getAnnounceUrl());
+
+  btAnnounce.announceFailure();
+
+  CPPUNIT_ASSERT_EQUAL(string("http://localhost2/announce?info_hash=%01%23Eg%89%ab%cd%ef%01%23Eg%89%ab%cd%ef%01%23Eg&peer_id=%2daria2%2dultrafastdltl&uploaded=1572864&downloaded=1310720&left=1572864&compact=1&key=AAAAAAAA&numwant=50&no_peer_id=1&port=6989&event=completed"), btAnnounce.getAnnounceUrl());
+
+  btAnnounce.announceSuccess();
+}

+ 1 - 0
test/Metalink2RequestGroupTest.cc

@@ -33,6 +33,7 @@ void Metalink2RequestGroupTest::testGenerate()
   {
     RequestGroupHandle rg = groups[0];
     Strings uris = rg->getUris();
+    sort(uris.begin(), uris.end());
     CPPUNIT_ASSERT_EQUAL((size_t)2, uris.size());
     CPPUNIT_ASSERT_EQUAL(string("ftp://ftphost/aria2-0.5.2.tar.bz2"), uris[0]);
     CPPUNIT_ASSERT_EQUAL(string("http://httphost/aria2-0.5.2.tar.bz2"), uris[1]);