FeedbackURISelectorTest.cc 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. #include "FeedbackURISelector.h"
  2. #include <cppunit/extensions/HelperMacros.h>
  3. #include "Exception.h"
  4. #include "util.h"
  5. #include "array_fun.h"
  6. #include "ServerStatMan.h"
  7. #include "ServerStat.h"
  8. #include "FileEntry.h"
  9. namespace aria2 {
  10. class FeedbackURISelectorTest : public CppUnit::TestFixture {
  11. CPPUNIT_TEST_SUITE(FeedbackURISelectorTest);
  12. CPPUNIT_TEST(testSelect_withoutServerStat);
  13. CPPUNIT_TEST(testSelect);
  14. CPPUNIT_TEST(testSelect_withUsedHosts);
  15. CPPUNIT_TEST(testSelect_skipErrorHost);
  16. CPPUNIT_TEST_SUITE_END();
  17. private:
  18. FileEntry fileEntry_;
  19. std::shared_ptr<ServerStatMan> ssm;
  20. std::shared_ptr<FeedbackURISelector> sel;
  21. public:
  22. void setUp()
  23. {
  24. fileEntry_.setUris(
  25. {"http://alpha/file", "ftp://alpha/file", "http://bravo/file"});
  26. ssm.reset(new ServerStatMan());
  27. sel.reset(new FeedbackURISelector(ssm));
  28. }
  29. void tearDown() {}
  30. void testSelect_withoutServerStat();
  31. void testSelect();
  32. void testSelect_withUsedHosts();
  33. void testSelect_skipErrorHost();
  34. };
  35. CPPUNIT_TEST_SUITE_REGISTRATION(FeedbackURISelectorTest);
  36. void FeedbackURISelectorTest::testSelect_withoutServerStat()
  37. {
  38. std::vector<std::pair<size_t, std::string>> usedHosts;
  39. // Without ServerStat and usedHosts, selector returns first URI
  40. std::string uri = sel->select(&fileEntry_, usedHosts);
  41. CPPUNIT_ASSERT_EQUAL(std::string("http://alpha/file"), uri);
  42. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry_.getRemainingUris().size());
  43. }
  44. void FeedbackURISelectorTest::testSelect()
  45. {
  46. std::shared_ptr<ServerStat> bravo(new ServerStat("bravo", "http"));
  47. bravo->updateDownloadSpeed(100000);
  48. std::shared_ptr<ServerStat> alphaFTP(new ServerStat("alpha", "ftp"));
  49. alphaFTP->updateDownloadSpeed(80000);
  50. std::shared_ptr<ServerStat> alphaHTTP(new ServerStat("alpha", "http"));
  51. alphaHTTP->updateDownloadSpeed(180000);
  52. alphaHTTP->setError();
  53. std::vector<std::pair<size_t, std::string>> usedHosts;
  54. ssm->add(bravo);
  55. ssm->add(alphaFTP);
  56. ssm->add(alphaHTTP);
  57. CPPUNIT_ASSERT_EQUAL(std::string("http://bravo/file"),
  58. sel->select(&fileEntry_, usedHosts));
  59. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry_.getRemainingUris().size());
  60. CPPUNIT_ASSERT_EQUAL(std::string("ftp://alpha/file"),
  61. sel->select(&fileEntry_, usedHosts));
  62. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry_.getRemainingUris().size());
  63. }
  64. void FeedbackURISelectorTest::testSelect_withUsedHosts()
  65. {
  66. std::vector<std::pair<size_t, std::string>> usedHosts;
  67. usedHosts.push_back(std::make_pair(1, "bravo"));
  68. usedHosts.push_back(std::make_pair(2, "alpha"));
  69. CPPUNIT_ASSERT_EQUAL(std::string("http://bravo/file"),
  70. sel->select(&fileEntry_, usedHosts));
  71. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry_.getRemainingUris().size());
  72. CPPUNIT_ASSERT_EQUAL(std::string("http://alpha/file"),
  73. sel->select(&fileEntry_, usedHosts));
  74. CPPUNIT_ASSERT_EQUAL((size_t)1, fileEntry_.getRemainingUris().size());
  75. CPPUNIT_ASSERT_EQUAL(std::string("ftp://alpha/file"),
  76. sel->select(&fileEntry_, usedHosts));
  77. CPPUNIT_ASSERT_EQUAL((size_t)0, fileEntry_.getRemainingUris().size());
  78. }
  79. void FeedbackURISelectorTest::testSelect_skipErrorHost()
  80. {
  81. std::shared_ptr<ServerStat> alphaHTTP(new ServerStat("alpha", "http"));
  82. alphaHTTP->setError();
  83. std::shared_ptr<ServerStat> alphaFTP(new ServerStat("alpha", "ftp"));
  84. alphaFTP->setError();
  85. std::vector<std::pair<size_t, std::string>> usedHosts;
  86. ssm->add(alphaHTTP);
  87. ssm->add(alphaFTP);
  88. CPPUNIT_ASSERT_EQUAL(std::string("http://bravo/file"),
  89. sel->select(&fileEntry_, usedHosts));
  90. CPPUNIT_ASSERT_EQUAL((size_t)2, fileEntry_.getRemainingUris().size());
  91. }
  92. } // namespace aria2