MetalinkProcessorTest.cc 18 KB

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