MetalinkProcessorTest.cc 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. #include "MetalinkProcessorFactory.h"
  2. #include "MetalinkParserStateMachine.h"
  3. #include "Exception.h"
  4. #include "DefaultDiskWriter.h"
  5. #include "ByteArrayDiskWriter.h"
  6. #include "MetalinkProcessor.h"
  7. #include "Metalinker.h"
  8. #include "MetalinkEntry.h"
  9. #include "MetalinkResource.h"
  10. #ifdef ENABLE_MESSAGE_DIGEST
  11. # include "ChunkChecksum.h"
  12. # include "Checksum.h"
  13. #endif // ENABLE_MESSAGE_DIGEST
  14. #include <cppunit/extensions/HelperMacros.h>
  15. namespace aria2 {
  16. class MetalinkProcessorTest:public CppUnit::TestFixture {
  17. CPPUNIT_TEST_SUITE(MetalinkProcessorTest);
  18. CPPUNIT_TEST(testParseFile);
  19. CPPUNIT_TEST(testParseFromBinaryStream);
  20. CPPUNIT_TEST(testMalformedXML);
  21. CPPUNIT_TEST(testMalformedXML2);
  22. CPPUNIT_TEST(testBadSize);
  23. CPPUNIT_TEST(testBadMaxConn);
  24. CPPUNIT_TEST(testNoName);
  25. CPPUNIT_TEST(testBadURLPrefs);
  26. CPPUNIT_TEST(testBadURLMaxConn);
  27. #ifdef ENABLE_MESSAGE_DIGEST
  28. CPPUNIT_TEST(testUnsupportedType);
  29. CPPUNIT_TEST(testMultiplePieces);
  30. CPPUNIT_TEST(testBadPieceNo);
  31. CPPUNIT_TEST(testBadPieceLength);
  32. CPPUNIT_TEST(testUnsupportedType_piece);
  33. #endif // ENABLE_MESSAGE_DIGEST
  34. CPPUNIT_TEST(testLargeFileSize);
  35. CPPUNIT_TEST_SUITE_END();
  36. private:
  37. public:
  38. void testParseFile();
  39. void testParseFromBinaryStream();
  40. void testMalformedXML();
  41. void testMalformedXML2();
  42. void testBadSize();
  43. void testBadMaxConn();
  44. void testNoName();
  45. void testBadURLPrefs();
  46. void testBadURLMaxConn();
  47. #ifdef ENABLE_MESSAGE_DIGEST
  48. void testUnsupportedType();
  49. void testMultiplePieces();
  50. void testBadPieceNo();
  51. void testBadPieceLength();
  52. void testUnsupportedType_piece();
  53. #endif // ENABLE_MESSAGE_DIGEST
  54. void testLargeFileSize();
  55. };
  56. CPPUNIT_TEST_SUITE_REGISTRATION( MetalinkProcessorTest );
  57. void MetalinkProcessorTest::testParseFile()
  58. {
  59. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  60. try {
  61. SharedHandle<Metalinker> metalinker = proc->parseFile("test.xml");
  62. std::deque<SharedHandle<MetalinkEntry> >::iterator entryItr = metalinker->entries.begin();
  63. SharedHandle<MetalinkEntry> entry1 = *entryItr;
  64. CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), entry1->getPath());
  65. CPPUNIT_ASSERT_EQUAL((int64_t)0, entry1->getLength());
  66. CPPUNIT_ASSERT_EQUAL(std::string("0.5.2"), entry1->version);
  67. CPPUNIT_ASSERT_EQUAL(std::string("en-US"), entry1->language);
  68. CPPUNIT_ASSERT_EQUAL(std::string("Linux-x86"), entry1->os);
  69. CPPUNIT_ASSERT_EQUAL((int32_t)1, entry1->maxConnections);
  70. #ifdef ENABLE_MESSAGE_DIGEST
  71. CPPUNIT_ASSERT_EQUAL(std::string("a96cf3f0266b91d87d5124cf94326422800b627d"),
  72. entry1->checksum->getMessageDigest());
  73. CPPUNIT_ASSERT_EQUAL(std::string("sha1"), entry1->checksum->getAlgo());
  74. #endif // ENABLE_MESSAGE_DIGEST
  75. std::deque<SharedHandle<MetalinkResource> >::iterator resourceItr1 = entry1->resources.begin();
  76. SharedHandle<MetalinkResource> resource1 = *resourceItr1;
  77. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, resource1->type);
  78. CPPUNIT_ASSERT_EQUAL(std::string("JP"), resource1->location);
  79. CPPUNIT_ASSERT_EQUAL((int32_t)100, resource1->preference);
  80. CPPUNIT_ASSERT_EQUAL(std::string("ftp://ftphost/aria2-0.5.2.tar.bz2"),
  81. resource1->url);
  82. CPPUNIT_ASSERT_EQUAL((int32_t)1, resource1->maxConnections);
  83. resourceItr1++;
  84. SharedHandle<MetalinkResource> resource2 = *resourceItr1;
  85. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_HTTP, resource2->type);
  86. CPPUNIT_ASSERT_EQUAL(std::string("US"), resource2->location);
  87. CPPUNIT_ASSERT_EQUAL((int32_t)100, resource2->preference);
  88. CPPUNIT_ASSERT_EQUAL(std::string("http://httphost/aria2-0.5.2.tar.bz2"),
  89. resource2->url);
  90. CPPUNIT_ASSERT_EQUAL((int32_t)-1, resource2->maxConnections);
  91. entryItr++;
  92. SharedHandle<MetalinkEntry> entry2 = *entryItr;
  93. CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.1.tar.bz2"), entry2->getPath());
  94. CPPUNIT_ASSERT_EQUAL((int64_t)345689, entry2->getLength());
  95. CPPUNIT_ASSERT_EQUAL(std::string("0.5.1"), entry2->version);
  96. CPPUNIT_ASSERT_EQUAL(std::string("ja-JP"), entry2->language);
  97. CPPUNIT_ASSERT_EQUAL(std::string("Linux-m68k"), entry2->os);
  98. CPPUNIT_ASSERT_EQUAL((int32_t)-1, entry2->maxConnections);
  99. #ifdef ENABLE_MESSAGE_DIGEST
  100. CPPUNIT_ASSERT_EQUAL(std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"),
  101. entry2->checksum->getMessageDigest());
  102. CPPUNIT_ASSERT_EQUAL((int32_t)2, entry2->chunkChecksum->countChecksum());
  103. CPPUNIT_ASSERT_EQUAL((int32_t)262144, entry2->chunkChecksum->getChecksumLength());
  104. CPPUNIT_ASSERT_EQUAL(std::string("179463a88d79cbf0b1923991708aead914f26142"),
  105. entry2->chunkChecksum->getChecksum(0));
  106. CPPUNIT_ASSERT_EQUAL(std::string("fecf8bc9a1647505fe16746f94e97a477597dbf3"),
  107. entry2->chunkChecksum->getChecksum(1));
  108. CPPUNIT_ASSERT_EQUAL(std::string("sha1"), entry2->checksum->getAlgo());
  109. #endif // ENABLE_MESSAGE_DIGEST
  110. entryItr++;
  111. // test case: verification hash is not provided
  112. SharedHandle<MetalinkEntry> entry3 = *entryItr;
  113. CPPUNIT_ASSERT_EQUAL(std::string("NoVerificationHash"), entry3->getPath());
  114. #ifdef ENABLE_MESSAGE_DIGEST
  115. CPPUNIT_ASSERT(entry3->checksum.isNull());
  116. CPPUNIT_ASSERT(entry3->chunkChecksum.isNull());
  117. #endif // ENABLE_MESSAGE_DIGEST
  118. entryItr++;
  119. // test case: unsupported verification hash is included
  120. SharedHandle<MetalinkEntry> entry4 = *entryItr;
  121. CPPUNIT_ASSERT_EQUAL(std::string("UnsupportedVerificationHashTypeIncluded"), entry4->getPath());
  122. #ifdef ENABLE_MESSAGE_DIGEST
  123. CPPUNIT_ASSERT_EQUAL(std::string("sha1"),
  124. entry4->checksum->getAlgo());
  125. CPPUNIT_ASSERT_EQUAL(std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"),
  126. entry4->checksum->getMessageDigest());
  127. CPPUNIT_ASSERT_EQUAL(std::string("sha1"),
  128. entry4->chunkChecksum->getAlgo());
  129. #endif // ENABLE_MESSAGE_DIGEST
  130. } catch(Exception* e) {
  131. CPPUNIT_FAIL(e->getMsg());
  132. delete e;
  133. }
  134. }
  135. void MetalinkProcessorTest::testParseFromBinaryStream()
  136. {
  137. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  138. DefaultDiskWriterHandle dw = new DefaultDiskWriter();
  139. dw->openExistingFile("test.xml");
  140. try {
  141. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  142. std::deque<SharedHandle<MetalinkEntry> >::iterator entryItr = m->entries.begin();
  143. SharedHandle<MetalinkEntry> entry1 = *entryItr;
  144. CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), entry1->getPath());
  145. } catch(Exception* e) {
  146. CPPUNIT_FAIL(e->getMsg());
  147. delete e;
  148. }
  149. }
  150. void MetalinkProcessorTest::testMalformedXML()
  151. {
  152. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  153. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  154. dw->setString("<metalink><files></file></metalink>");
  155. try {
  156. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  157. CPPUNIT_FAIL("exception must be thrown.");
  158. } catch(Exception* e) {
  159. std::cerr << *e << std::endl;
  160. delete e;
  161. }
  162. }
  163. void MetalinkProcessorTest::testMalformedXML2()
  164. {
  165. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  166. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  167. dw->setString("<metalink><files></files>");
  168. try {
  169. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  170. CPPUNIT_FAIL("exception must be thrown.");
  171. } catch(Exception* e) {
  172. std::cerr << *e << std::endl;
  173. delete e;
  174. }
  175. }
  176. void MetalinkProcessorTest::testBadSize()
  177. {
  178. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  179. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  180. dw->setString("<metalink>"
  181. "<files>"
  182. "<file name=\"aria2-0.5.2.tar.bz2\">"
  183. " <size>abc</size>"
  184. " <version>0.5.2</version>"
  185. " <language>en-US</language>"
  186. " <os>Linux-x86</os>"
  187. "</file>"
  188. "</files>"
  189. "</metalink>");
  190. try {
  191. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  192. std::deque<SharedHandle<MetalinkEntry> >::iterator entryItr = m->entries.begin();
  193. SharedHandle<MetalinkEntry> e = *entryItr;
  194. CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), e->getPath());
  195. CPPUNIT_ASSERT_EQUAL((int64_t)0, e->getLength());
  196. CPPUNIT_ASSERT_EQUAL(std::string("0.5.2"), e->version);
  197. CPPUNIT_ASSERT_EQUAL(std::string("en-US"), e->language);
  198. CPPUNIT_ASSERT_EQUAL(std::string("Linux-x86"), e->os);
  199. } catch(Exception* e) {
  200. CPPUNIT_FAIL(e->getMsg());
  201. delete e;
  202. }
  203. }
  204. void MetalinkProcessorTest::testBadMaxConn()
  205. {
  206. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  207. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  208. dw->setString("<metalink>"
  209. "<files>"
  210. "<file name=\"aria2-0.5.2.tar.bz2\">"
  211. " <size>43743838</size>"
  212. " <version>0.5.2</version>"
  213. " <language>en-US</language>"
  214. " <os>Linux-x86</os>"
  215. " <resources maxconnections=\"abc\"/>"
  216. "</file>"
  217. "</files>"
  218. "</metalink>");
  219. try {
  220. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  221. std::deque<SharedHandle<MetalinkEntry> >::iterator entryItr = m->entries.begin();
  222. SharedHandle<MetalinkEntry> e = *entryItr;
  223. CPPUNIT_ASSERT_EQUAL((int64_t)43743838, e->getLength());
  224. } catch(Exception* e) {
  225. CPPUNIT_FAIL(e->getMsg());
  226. delete e;
  227. }
  228. }
  229. void MetalinkProcessorTest::testNoName()
  230. {
  231. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  232. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  233. dw->setString("<metalink>"
  234. "<files>"
  235. "<file>"
  236. " <size>1024</size>"
  237. " <version>0.0.1</version>"
  238. " <language>GB</language>"
  239. " <os>Linux-x64</os>"
  240. "</file>"
  241. "<file name=\"aria2-0.5.2.tar.bz2\">"
  242. " <size>43743838</size>"
  243. " <version>0.5.2</version>"
  244. " <language>en-US</language>"
  245. " <os>Linux-x86</os>"
  246. "</file>"
  247. "</files>"
  248. "</metalink>");
  249. try {
  250. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  251. CPPUNIT_ASSERT_EQUAL((size_t)1, m->entries.size());
  252. std::deque<SharedHandle<MetalinkEntry> >::iterator entryItr = m->entries.begin();
  253. SharedHandle<MetalinkEntry> e = *entryItr;
  254. CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), e->getPath());
  255. } catch(Exception* e) {
  256. CPPUNIT_FAIL(e->getMsg());
  257. delete e;
  258. }
  259. }
  260. void MetalinkProcessorTest::testBadURLPrefs()
  261. {
  262. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  263. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  264. dw->setString("<metalink>"
  265. "<files>"
  266. "<file name=\"aria2-0.5.2.tar.bz2\">"
  267. " <size>43743838</size>"
  268. " <version>0.5.2</version>"
  269. " <language>en-US</language>"
  270. " <os>Linux-x86</os>"
  271. " <resources>"
  272. " <url type=\"ftp\" maxconnections=\"1\" preference=\"xyz\" location=\"JP\">ftp://mirror/</url>"
  273. " </resources>"
  274. "</file>"
  275. "</files>"
  276. "</metalink>");
  277. try {
  278. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  279. SharedHandle<MetalinkEntry> e = m->entries[0];
  280. SharedHandle<MetalinkResource> r = e->resources[0];
  281. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, r->type);
  282. CPPUNIT_ASSERT_EQUAL(0, r->preference);
  283. CPPUNIT_ASSERT_EQUAL(1, r->maxConnections);
  284. CPPUNIT_ASSERT_EQUAL(std::string("JP"), r->location);
  285. } catch(Exception* e) {
  286. CPPUNIT_FAIL(e->getMsg());
  287. delete e;
  288. }
  289. }
  290. void MetalinkProcessorTest::testBadURLMaxConn()
  291. {
  292. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  293. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  294. dw->setString("<metalink>"
  295. "<files>"
  296. "<file name=\"aria2-0.5.2.tar.bz2\">"
  297. " <size>43743838</size>"
  298. " <version>0.5.2</version>"
  299. " <language>en-US</language>"
  300. " <os>Linux-x86</os>"
  301. " <resources>"
  302. " <url maxconnections=\"xyz\" type=\"ftp\" preference=\"100\" location=\"JP\">ftp://mirror/</url>"
  303. " </resources>"
  304. "</file>"
  305. "</files>"
  306. "</metalink>");
  307. try {
  308. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  309. SharedHandle<MetalinkEntry> e = m->entries[0];
  310. SharedHandle<MetalinkResource> r = e->resources[0];
  311. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, r->type);
  312. CPPUNIT_ASSERT_EQUAL(100, r->preference);
  313. CPPUNIT_ASSERT_EQUAL(-1, r->maxConnections);
  314. CPPUNIT_ASSERT_EQUAL(std::string("JP"), r->location);
  315. } catch(Exception* e) {
  316. CPPUNIT_FAIL(e->getMsg());
  317. delete e;
  318. }
  319. }
  320. #ifdef ENABLE_MESSAGE_DIGEST
  321. void MetalinkProcessorTest::testUnsupportedType()
  322. {
  323. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  324. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  325. dw->setString("<metalink>"
  326. "<files>"
  327. "<file name=\"aria2-0.5.2.tar.bz2\">"
  328. " <size>43743838</size>"
  329. " <version>0.5.2</version>"
  330. " <language>en-US</language>"
  331. " <os>Linux-x86</os>"
  332. " <resources>"
  333. " <url type=\"ftp\">ftp://mirror/</url>"
  334. " <url type=\"magnet\">magnet:xt=XYZ</url>"
  335. " <url type=\"http\">http://mirror/</url>"
  336. " </resources>"
  337. "</file>"
  338. "</files>"
  339. "</metalink>");
  340. try {
  341. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  342. SharedHandle<MetalinkEntry> e = m->entries[0];
  343. CPPUNIT_ASSERT_EQUAL((size_t)3, e->resources.size());
  344. SharedHandle<MetalinkResource> r1 = e->resources[0];
  345. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, r1->type);
  346. SharedHandle<MetalinkResource> r2 = e->resources[1];
  347. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_NOT_SUPPORTED, r2->type);
  348. SharedHandle<MetalinkResource> r3 = e->resources[2];
  349. CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_HTTP, r3->type);
  350. } catch(Exception* e) {
  351. CPPUNIT_FAIL(e->getMsg());
  352. delete e;
  353. }
  354. }
  355. void MetalinkProcessorTest::testMultiplePieces()
  356. {
  357. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  358. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  359. dw->setString("<metalink>"
  360. "<files>"
  361. "<file name=\"aria2.tar.bz2\">"
  362. " <verification>"
  363. " <pieces length=\"512\" type=\"md5\">"
  364. " </pieces>"
  365. " <pieces length=\"1024\" type=\"sha1\">"
  366. " </pieces>"
  367. " <pieces length=\"2048\" type=\"sha256\">"
  368. " </pieces>"
  369. " </verification>"
  370. "</file>"
  371. "</files>"
  372. "</metalink>");
  373. try {
  374. // aria2 prefers sha1
  375. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  376. SharedHandle<MetalinkEntry> e = m->entries[0];
  377. SharedHandle<ChunkChecksum> c = e->chunkChecksum;
  378. CPPUNIT_ASSERT_EQUAL(std::string("sha1"), c->getAlgo());
  379. CPPUNIT_ASSERT_EQUAL(1024, c->getChecksumLength());
  380. } catch(Exception* e) {
  381. CPPUNIT_FAIL(e->getMsg());
  382. delete e;
  383. }
  384. }
  385. void MetalinkProcessorTest::testBadPieceNo()
  386. {
  387. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  388. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  389. dw->setString("<metalink>"
  390. "<files>"
  391. "<file name=\"aria2.tar.bz2\">"
  392. " <verification>"
  393. " <pieces length=\"512\" type=\"sha1\">"
  394. " <hash piece=\"0\">abc</hash>"
  395. " <hash piece=\"xyz\">xyz</hash>"
  396. " </pieces>"
  397. " <pieces length=\"512\" type=\"sha256\">"
  398. " <hash piece=\"0\">abc</hash>"
  399. " </pieces>"
  400. " </verification>"
  401. "</file>"
  402. "</files>"
  403. "</metalink>");
  404. try {
  405. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  406. SharedHandle<MetalinkEntry> e = m->entries[0];
  407. SharedHandle<ChunkChecksum> c = e->chunkChecksum;
  408. CPPUNIT_ASSERT_EQUAL(std::string("sha256"), c->getAlgo());
  409. } catch(Exception* e) {
  410. CPPUNIT_FAIL(e->getMsg());
  411. delete e;
  412. }
  413. }
  414. void MetalinkProcessorTest::testBadPieceLength()
  415. {
  416. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  417. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  418. dw->setString("<metalink>"
  419. "<files>"
  420. "<file name=\"aria2.tar.bz2\">"
  421. " <verification>"
  422. " <pieces length=\"xyz\" type=\"sha1\">"
  423. " <hash piece=\"0\">abc</hash>"
  424. " </pieces>"
  425. " <pieces length=\"1024\" type=\"sha256\">"
  426. " <hash piece=\"0\">abc</hash>"
  427. " </pieces>"
  428. " </verification>"
  429. "</file>"
  430. "</files>"
  431. "</metalink>");
  432. try {
  433. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  434. SharedHandle<MetalinkEntry> e = m->entries[0];
  435. SharedHandle<ChunkChecksum> c = e->chunkChecksum;
  436. CPPUNIT_ASSERT_EQUAL(std::string("sha256"), c->getAlgo());
  437. } catch(Exception* e) {
  438. CPPUNIT_FAIL(e->getMsg());
  439. delete e;
  440. }
  441. }
  442. void MetalinkProcessorTest::testUnsupportedType_piece()
  443. {
  444. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  445. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  446. dw->setString("<metalink>"
  447. "<files>"
  448. "<file name=\"aria2.tar.bz2\">"
  449. " <verification>"
  450. " <pieces length=\"512\" type=\"ARIA2\">"
  451. " <hash piece=\"0\">abc</hash>"
  452. " </pieces>"
  453. " <pieces length=\"1024\" type=\"sha256\">"
  454. " <hash piece=\"0\">abc</hash>"
  455. " </pieces>"
  456. " </verification>"
  457. "</file>"
  458. "</files>"
  459. "</metalink>");
  460. try {
  461. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  462. SharedHandle<MetalinkEntry> e = m->entries[0];
  463. SharedHandle<ChunkChecksum> c = e->chunkChecksum;
  464. CPPUNIT_ASSERT_EQUAL(std::string("sha256"), c->getAlgo());
  465. } catch(Exception* e) {
  466. CPPUNIT_FAIL(e->getMsg());
  467. delete e;
  468. }
  469. }
  470. #endif // ENABLE_MESSAGE_DIGEST
  471. void MetalinkProcessorTest::testLargeFileSize()
  472. {
  473. SharedHandle<MetalinkProcessor> proc = MetalinkProcessorFactory::newInstance();
  474. SharedHandle<ByteArrayDiskWriter> dw = new ByteArrayDiskWriter();
  475. dw->setString("<metalink>"
  476. "<files>"
  477. "<file name=\"dvd.iso\">"
  478. " <size>9223372036854775807</size>"
  479. " <resources>"
  480. " <url type=\"http\">ftp://mirror/</url>"
  481. " </resources>"
  482. "</file>"
  483. "</files>"
  484. "</metalink>");
  485. try {
  486. SharedHandle<Metalinker> m = proc->parseFromBinaryStream(dw);
  487. SharedHandle<MetalinkEntry> e = m->entries[0];
  488. CPPUNIT_ASSERT_EQUAL(9223372036854775807LL, e->getLength());
  489. } catch(Exception* e) {
  490. std::cerr << *e << std::endl;
  491. std::string m = e->getMsg();
  492. delete e;
  493. CPPUNIT_FAIL(m);
  494. }
  495. }
  496. } // namespace aria2