diff --git a/src/Dependency.h b/src/Dependency.h index abae39fd..514b9249 100644 --- a/src/Dependency.h +++ b/src/Dependency.h @@ -43,7 +43,7 @@ class Dependency { public: virtual ~Dependency() {} - virtual bool resolve() = 0; + virtual bool resolve() = 0; // throw() }; } // namespace aria2 diff --git a/src/RequestGroupMan.cc b/src/RequestGroupMan.cc index d84f4973..feff9950 100644 --- a/src/RequestGroupMan.cc +++ b/src/RequestGroupMan.cc @@ -208,7 +208,11 @@ namespace { void notifyDownloadEvent (const std::string& event, const SharedHandle& group) { - SingletonHolder::instance()->notifyDownloadEvent(event, group); + // Check NULL to make unit test easier. + Notifier* notifier = SingletonHolder::instance(); + if(notifier) { + notifier->notifyDownloadEvent(event, group); + } } } // namespace @@ -486,6 +490,7 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) while(count < num && (uriListParser_ || resitr != reservedGroups_.end())) { if(uriListParser_ && resitr == reservedGroups_.end()) { std::vector > groups; + // May throw exception bool ok = createRequestGroupFromUriListParser(groups, option_, uriListParser_.get()); if(ok) { @@ -501,28 +506,21 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) } SharedHandle groupToAdd = (*resitr).second; std::vector commands; - try { - if((rpc_ && groupToAdd->isPauseRequested()) || - !groupToAdd->isDependencyResolved()) { - ++resitr; - continue; - } + if((rpc_ && groupToAdd->isPauseRequested()) || + !groupToAdd->isDependencyResolved()) { ++resitr; - reservedGroups_.erase(groupToAdd->getGID()); - // Drop pieceStorage here because paused download holds its - // reference. - groupToAdd->dropPieceStorage(); - configureRequestGroup(groupToAdd); - groupToAdd->setRequestGroupMan(this); + continue; + } + ++resitr; + reservedGroups_.erase(groupToAdd->getGID()); + // Drop pieceStorage here because paused download holds its + // reference. + groupToAdd->dropPieceStorage(); + configureRequestGroup(groupToAdd); + groupToAdd->setRequestGroupMan(this); + try { createInitialCommand(groupToAdd, commands, e); - if(commands.empty()) { - requestQueueCheck(); - } - groupToAdd->setState(RequestGroup::STATE_ACTIVE); - requestGroups_.push_back(groupToAdd->getGID(), groupToAdd); ++count; - e->addCommand(commands); - commands.clear(); } catch(RecoverableException& ex) { A2_LOG_ERROR_EX(EX_EXCEPTION_CAUGHT, ex); A2_LOG_DEBUG("Deleting temporal commands."); @@ -530,12 +528,17 @@ void RequestGroupMan::fillRequestGroupFromReserver(DownloadEngine* e) commands.clear(); A2_LOG_DEBUG("Commands deleted"); groupToAdd->setLastErrorCode(ex.getErrorCode()); - // We add groupToAdd to e in order to it is processed in + // We add groupToAdd to e later in order to it is processed in // removeStoppedGroup(). - groupToAdd->setState(RequestGroup::STATE_ACTIVE); - requestGroups_.push_back(groupToAdd->getGID(), groupToAdd); - requestQueueCheck(); } + if(commands.empty()) { + requestQueueCheck(); + } else { + e->addCommand(commands); + } + groupToAdd->setState(RequestGroup::STATE_ACTIVE); + requestGroups_.push_back(groupToAdd->getGID(), groupToAdd); + util::executeHookByOptName(groupToAdd, e->getOption(), PREF_ON_DOWNLOAD_START); notifyDownloadEvent(Notifier::ON_DOWNLOAD_START, groupToAdd); diff --git a/test/RequestGroupManTest.cc b/test/RequestGroupManTest.cc index 0e8c3ef4..fa4fa39f 100644 --- a/test/RequestGroupManTest.cc +++ b/test/RequestGroupManTest.cc @@ -4,6 +4,7 @@ #include +#include "TestUtil.h" #include "prefs.h" #include "DownloadContext.h" #include "RequestGroup.h" @@ -16,6 +17,8 @@ #include "array_fun.h" #include "RecoverableException.h" #include "util.h" +#include "DownloadEngine.h" +#include "SelectEventPoll.h" namespace aria2 { @@ -27,13 +30,27 @@ class RequestGroupManTest : public CppUnit::TestFixture { CPPUNIT_TEST(testLoadServerStat); CPPUNIT_TEST(testSaveServerStat); CPPUNIT_TEST(testChangeReservedGroupPosition); + CPPUNIT_TEST(testFillRequestGroupFromReserver); CPPUNIT_TEST_SUITE_END(); private: + SharedHandle e_; SharedHandle