MetalinkProcessorTest.cc 18 KB

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