aria2-1.33.1/0000755000175000017500000000000013200576205007576 500000000000000aria2-1.33.1/test-driver0000755000175000017500000001104013200576026011711 00000000000000#! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2013-07-13.22; # UTC # Copyright (C) 2011-2014 Free Software Foundation, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # This file is maintained in Automake, please report # bugs to or send patches to # . # Make unconditional expansion of undefined variables an error. This # helps a lot in preventing typo-related bugs. set -u usage_error () { echo "$0: $*" >&2 print_usage >&2 exit 2 } print_usage () { cat <$log_file 2>&1 estatus=$? if test $enable_hard_errors = no && test $estatus -eq 99; then tweaked_estatus=1 else tweaked_estatus=$estatus fi case $tweaked_estatus:$expect_failure in 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; 0:*) col=$grn res=PASS recheck=no gcopy=no;; 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; *:*) col=$red res=FAIL recheck=yes gcopy=yes;; esac # Report the test outcome and exit status in the logs, so that one can # know whether the test passed or failed simply by looking at the '.log' # file, without the need of also peaking into the corresponding '.trs' # file (automake bug#11814). echo "$res $test_name (exit status: $estatus)" >>$log_file # Report outcome to console. echo "${col}${res}${std}: $test_name" # Register the test result, and other relevant metadata. echo ":test-result: $res" > $trs_file echo ":global-test-result: $res" >> $trs_file echo ":recheck: $recheck" >> $trs_file echo ":copy-in-global-log: $gcopy" >> $trs_file # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-time-zone: "UTC" # time-stamp-end: "; # UTC" # End: aria2-1.33.1/test/0000755000175000017500000000000013200576205010555 500000000000000aria2-1.33.1/test/local-metaurl.meta40000644000175000017500000000043713200575774014210 00000000000000 README.torrent http://example.org/README aria2-1.33.1/test/base_uri.xml0000644000175000017500000000024713200575774013025 00000000000000 example.ext aria2-1.33.1/test/metalink4-dosdirtraversal.xml0000644000175000017500000000103713200575774016330 00000000000000 http://example.com/example.ext 12345 http://example.com/example.torrent 12345 http://example.com/example.torrent aria2-1.33.1/test/serialize_session.meta40000644000175000017500000000040413200575774015173 00000000000000 http://example.org/README http://example.org/image.iso aria2-1.33.1/test/metalink4-groupbymetaurl.xml0000644000175000017500000000106113200575774016176 00000000000000 1000 http://file1p1 http://torrent 2000 http://file2p1 3000 http://file3p1 http://torrent aria2-1.33.1/test/metalink3-dirtraversal.xml0000644000175000017500000000203613200575774015621 00000000000000 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff fffff -----END PGP SIGNATURE----- http://example.org/aria2-0.5.2.tar.bz2 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff fffff -----END PGP SIGNATURE----- http://example.org/aria2-0.5.3.tar.bz2 aria2-1.33.1/test/metalink4.xml0000644000175000017500000000253713200575774013130 00000000000000 2009-05-15T12:23:23Z 786430 Example 1.0 en A description of the example file for download. cbd18db4cc2f85cedef654fccc4a4d8 0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33 5bd9f7248df0f3a6a86ab6c95f48787d546efa14 9413ee70957a09d55704123687478e07f18c7b29 44213f9f4d59b557314fadcd233232eebcac8012 0245178074fd042e19b7c3885b360fc21064b30e73f5626c7e3b005d048069c5 487ba2299be7f759d7c7bf6a4ac3a32cee81f1bb9332fc485947e32918864fb2 37290d74ac4d186e3a8e5785d259d2ec04fac91ae28092e7620ec8bc99e830aa ftp://ftp.example.com/example.ext http://example.com/example.ext http://example.com/example.ext.torrent a signature aria2-1.33.1/test/utf8.torrent0000644000175000017500000000100213200575774013005 00000000000000d8:announce36:http://aria.rednoah.com/announce.php13:announce-listll16:http://tracker1 el15:http://tracker2el15:http://tracker3ee7:privatei1e7:comment17:REDNOAH.COM RULES13:comment.utf-821:This is utf8 comment.13:creation datei1123456789e4:infod5:filesld6:lengthi284e4:pathl5:aria23:src6:aria2ce10:path.utf-8l13:path in utf-8eed6:lengthi100e4:pathl19:aria2-0.2.2.tar.bz2eee4:name10:aria2-test10:name.utf-813:name in utf-812:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCeearia2-1.33.1/test/2files.metalink0000644000175000017500000000112013200575774013413 00000000000000 aria2 http://aria2.sourceforge.net/ The high speed download utility http://localhost/aria2-5.0.0.tar.bz2 http://localhost/aria2-5.0.0.deb aria2-1.33.1/test/input_uris.txt0000644000175000017500000000016313200575774013451 00000000000000http://alpha/file http://bravo/file http://charlie/file out=myfile.out dir=/mydownloads http://delta/file.iso aria2-1.33.1/test/url-list-singleFileEndsWithSlash.torrent0000644000175000017500000000054413200575774020424 00000000000000d8:url-list22:http://localhost/dist/8:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod6:lengthi380e4:name14:aria2@.tar.bz212:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCeearia2-1.33.1/test/url-list-singleFile.torrent0000644000175000017500000000056013200575774015761 00000000000000d8:url-list35:http://localhost/dist/aria2.tar.bz28:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod6:lengthi380e4:name13:aria2.tar.bz212:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCeearia2-1.33.1/test/url-list-multiFile.torrent0000644000175000017500000000071713200575774015636 00000000000000d8:url-listl22:http://localhost/dist/18:http://mirror/diste8:announce36:http://aria.rednoah.com/announce.php13:announce-listll15:http://tracker1el15:http://tracker2el15:http://tracker3ee7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod5:filesld6:lengthi284e4:pathl6:aria2@4:src@7:aria2c@eed6:lengthi100e4:pathl19:aria2-0.2.2.tar.bz2eee4:name11:aria2-test@12:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCeearia2-1.33.1/test/test.xml0000644000175000017500000000571313200575774012216 00000000000000 aria2 http://aria2.sourceforge.net/ The high speed download utility 0.5.2 en-US Linux-x86 a96cf3f0266b91d87d5124cf94326422800b627d fc4d834e89c18c99b2615d902750948c -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff ffffffffffffffffffffffff fffff -----END PGP SIGNATURE----- ftp://ftphost/aria2-0.5.2.tar.bz2 http://httphost/aria2-0.5.2.tar.bz2 345689 0.5.1 ja-JP Linux-m68k 4c255b0ed130f5ea880f0aa061c3da0487e251cc 92296e19c406d77d21bda0bb944eac46 179463a88d79cbf0b1923991708aead914f26142 fecf8bc9a1647505fe16746f94e97a477597dbf3 ftp://ftphost/aria2-0.5.1.tar.bz2 http://httphost/aria2-0.5.1.tar.bz2 ftp://host/file 92296e19c406d77d21bda0bb944eac46 4c255b0ed130f5ea880f0aa061c3da0487e251cc 179463a88d79cbf0b1923991708aead914f26142 fecf8bc9a1647505fe16746f94e97a477597dbf3 179463a88d79cbf0b1923991708aead914f26142 fecf8bc9a1647505fe16746f94e97a477597dbf3 ftp://host/file http://host/torrent-http.integrated http://host/torrent-http.integrated.torrent aria2-1.33.1/test/test.torrent0000644000175000017500000000066213200575774013111 00000000000000d8:announce36:http://aria.rednoah.com/announce.php13:announce-listll16:http://tracker1 el15:http://tracker2el15:http://tracker3ee7:privatei1e7:comment17:REDNOAH.COM RULES13:creation datei1123456789e10:created by5:aria24:infod5:filesld6:lengthi284e4:pathl5:aria23:src6:aria2ceed6:lengthi100e4:pathl19:aria2-0.2.2.tar.bz2eee4:name10:aria2-test12:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCeearia2-1.33.1/test/single.torrent0000644000175000017500000000037113200575774013410 00000000000000d8:announce37:http://aria.rednoah.com/announce.php 7:comment17:REDNOAH.COM RULES13:creation datei1123456789e4:infod4:name19:aria2-0.8.2.tar.bz26:lengthi384e12:piece lengthi128e6:pieces60:AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCeearia2-1.33.1/test/sample.netrc0000644000175000017500000000047613200575774013034 00000000000000#sample netrc file for unit testing machine host1 login tujikawa password tujikawapassword account tujikawaaccount macdef init cd /home/aria2 machine machine host2 login aria2 password aria2password account aria2account macdef init #another comment line default login anonymous password ARIA2@USER account ARIA2@ACCTaria2-1.33.1/test/nscookietest.txt0000644000175000017500000000042413200575774013762 00000000000000# name=this is a omment line; localhost FALSE / TRUE 2147483647 JSESSIONID 123456789 expired FALSE / FALSE 1000 user me 192.168.0.1 TRUE /cgi-bin FALSE 0 passwd secret badformat something FALSE / FALSE 1463304912.5 TAX 1000 .example.org TRUE / FALSE 2147483647.123 novalue aria2-1.33.1/test/malformed.netrc0000644000175000017500000000007113200575774013510 00000000000000machine host2 login aria2 password aria2password account aria2-1.33.1/test/load-v0001.aria20000644000175000017500000000013613200575774013112 00000000000000"3DUfw@ aria2-1.33.1/test/load.aria20000644000175000017500000000013613200575774012346 00000000000000"3DUfw@ aria2-1.33.1/test/load-nonBt-v0001.aria20000644000175000017500000000011213200575774014162 00000000000000@ aria2-1.33.1/test/load-nonBt.aria20000644000175000017500000000013613200575774013424 00000000000000"3DUfw@ aria2-1.33.1/test/gzip_decode_test.gz0000644000175000017500000023374213200575774014377 00000000000000X&gHChangeLog\Yw8~~!vڒT2:3}c˱%W 2EҲk$v$jca]{qv>u*H6 tbf9BG)S(?22Igfo[q|1Uiw%&4P&Jn`"3b"5y8p8lat&< Fz/lퟥ"D]k.*WjjR-QPG9>I; :"5bq:?D '15l?[K<JVD` 2 ţ /S52 /T4M] N8N-P"e"6gKf_&Zyؤ}w:3߱)0D왕S%RIDcPD[՘5bQ%Q6{{ǮA̔,Bn~PL1KLpU&y&i5 Hki"5zNPÑHPJoDFS&8@퐘PO0[C냽v (SE`]r 86th$4B$}Y!VEVIϕ)IP>M@? Zk KŠ@䓴[_Wiv{q˒"S/[$/K''Ȃ52PBKyDb,`Fd%b["<}8!t^c27Tx]TܺsVWъl>k leO$/Mу%s:IT,lC laYXT:_jM3v}GJ{?ǜ*6.-eZR3}Cf1J /=)],[jp a̴}a`8}|A% l xtxLzp5_{mg`" ,0ÚՏC==0]P[VP>/t{"Bf> ) *s:՗@- i^0zCU+7US)j0nIU+^lv hӼ`gUdZ`vA~4Q` ,v"#O%DiM5d IPFPgam罌Ga჎oZnhPR+k?`7>Xw53P&ſ"5[t` ёN7/nݺ]̗*| E$ݠ+jS{"MpRh mSML R3-I3lb[9op7F?y J@V_@yBGV3DGm2+Pfd3(]]~.S&+#Bkր}u}蟠I(NS 2'1-;'lpA1yr<3ܓpK"Y4%hdyA@=c,,#C;A4UL+'DmS>oIҪ%%|x =Ujg̓A t!k f8?up5>(MbiyTUY>f1L Ц)@j-Y+G)U8@KP)ix` ~\/BB baݞW,|&u<K}wK톀&x-8 2KP*+CcXcb1+b'w`SaC~oW~K?dM~6Bd%`2Nd^qa]b|MlzGLfuQma1Ɏ/EfHah>#oUeEQA:bTPNk\^(;B-ftu,%5}KNd-9LRM$3A}Ps 'ځN-*1%tkX/ B̓u67H8vX8;vv1PH t$4)JP4 ,;2y}>!t+"!1ԑ :Ӥnܥ  :3BY_Uk.옧>aÆ<:w}J|X)tj˖xD1k)Z^/\݂`hgR~.PyY՚]zpB+:|_k9'T[ËC0mtw/o3xۊaCo;)ħ:ux|d Yu ;_`*='^XEL%U'{1JtXK08AG9c rrp+`He109x=4>[(h \nOtΙ]14 1H;Q. {;eς:;֥Kr= *}a*'5Wds#ݫOVi2 9G>|{Ѕ&8s]sg@[y6e_c*$X&eҰnjOyX~)EI9E7A$9q3b|`e&9.9`aB~Uef@oGr_~L x[`nlRy0 [ +tU' *_.n^zIh+{=m1.`$R *c$@iF%vrR^}~i)" \ȮXG@ "G=QDJͫ e &[Z2^Knk9M|ٰ3(91smoM0P5&AQ$tmtc+j_*;%ÃߜjtFK@q! b a{"_ LzN`Bx̃VӲ_Zt#[to,T׳9LX_rN-CvԪ;} f CS,;{. g[N΂A)1ޝ]]o~˾N^S1(uCD)=ئ%P QaYbfзv:nEizl0SX `.$R}Ue{\St:=N].|HVj-F`7Xj^w;)64fo05]CdlB+r1f8ϺOpfk;eJKㄢץ̜K(d{S%4Yucn.tqժؖ (z6%_!Υ T1Jpj{dReϽFdERyb EI#neo~ǓlNʒô, ['] "(q}+[˓ZUKASGWmlK 귵4tEB)q6Br:_oЪߒ%.#Ir.×/r`,9yEh٭W{6v KnI IK*0CI)YRD\DB"b`Ҷҫ{NgfuE~ƫ-/D<:_:T ~ c-C5'RA=:1Gn1>Ϗ8 <4]kA83Rjq47갪IhcOwyKAI:5bG|B[6)Րd$KWSԺ(u/0"Ů<'nvp rX&^'/L|q+ ~ؔqj }5JY)9E{`"B#ֿã ],p %K웳]=wTShGSxӨǂQ>+s_Eo,-ѲO%$$Qvݢyqψ>GY?b[4!ܰLMք6M][; (aKC`0+Gb#4/fI1BxŐ8:uŤk64[;O=@=o\Vy4廚l_i 땴t?maV߈#إmNE#wăQ }=NBfi-/D?mx Bu؇=f:dYl~;mVnwǹbwDX.<)#ֱā!MP+wl1Ņ%g}ޭβ /!| > ?uÔ^P$.!:Q)*$YYZMyѠVYtUR覙 L)ĂBitѰl*Fg=`lOIIEDdEw2^fX.~:*GqHGXR54:fԦ=k(-|FX,x N|։%Lħ]$ܛղ#Rr# ,nj~j='́>aϲ/YkP;_VJ\bO\_ Ƌ$,]X:-Fqى~~<\ ާbKbmq <&Pv*H wޢF RӔLz ""PIX&>Y[UA^db6cdR,(=py>nl9@ |Jk!sp+bCO -O.+DNɒ"&R ڃiR&V7z/3A0mt!fT$ mĄE sP;m+nW?>?@ Vz6߫Zjb2&L&]˔ҧhG }nt,Czt4g݀[HFG .VQ@jrs1χ=Ԑ#|Fq'27 ޣf%J;#=-T]?ъk|H,#.='qrEN{~O],8P~K f a5 E&pЊ?W7w C5?pO^}7nY,M| a߻zd _b ?qU:ζ](#CՈ@7Mvo? 2S\^ތ.:AF%P4_,T˻XƮI?κcTV8VƽӧxrkwIWN 2DR 3?d^T`@augQ䲰.ϼj565ʗsq]Fp *.3E{V @3t2}B-zo mVME}h{je&~,FSVuOdg?kck׽EK}y;]膁W:HxTv) oFtuwt.Dz{?<:b[ 2xЇv@&oMF"o24ʊM^/h̔&*qLIW-| ޷퇾лUѐA(}GYZ;/Y9OWJ kAoY9g=oLI=pSjj>n34c1ǚ7y8 p P¨Crtq0#g=3Vbrsi7t_=^$KC*' XJ{Zh*xViG:H0I\F6V7!FvD^. >rB V+? yjEId9j+U#]O|r6)>5$o/W6Z2>B>ybDeDLp/Ap <@gw<*s@!ae{kNcr*ܐ8آҽDW[յIbTEgZs( ui (!d 7Nw sM7X'|([ 洶K@w@idrXC֪i$YRDbGBp񔍇PW-Gp(5+&6rOCL{g"Ohp>B82AWwq1~lfaBU մ*n[bnFQ Ρ/͗/2 4LekNް[2 ?u9KTT/ˣk@4")*x"vPl j$8UL){2ZDMh'&,EzFGX [|_F6~=ur.Uc/PD:,2h詌K ԰$]gh)DB2wAq|ty 6 QP- ņLf- v΋ksU` bK/7'VRBpO*0/?zWЮc:c*:UD_<pӥxtłv+yyy0,@=ų2Q nܮ⪖Uk=ԁ4o*ejS*o[hnAr@#G=AY1kTQ NG-rI&B Uc| oMP[ą]Ms\.x@U)d3;9_ K0Y܀4Hk>Ob0_hȱR'Eu'z2+>7eXZN^3=s _&:\SR4 Ra*,DD loՐJkV{(3/­lg59mci)!_>ƃ٪bfL$GΓ\`96mojoCsٍz3^ʼn͋W=8qo=ش$VTʫlIW( `0B$9,H+`Fl9He?jH^Ms4(N;#zKx3iNs(e)=cb+喧w6sۄ,I-ckln3"$ɥHO9ԇxQצ n["ˌ zlRMGwط{t*-&XBz~1׆T2yMt2Fsf}n\QpJ^QG~ר[e %Tez,evo'f\dڊ3Ç ~=xPN^0k!^9ϕmؕ \oXֵawl{t_L﷨J)hD /LKtG/7{QQ 0<"]uDj2r *>C;Fdt XJm9-#I*u4Fw2ż(n{g%OG)yЬ&_">,XRm`nN~IHd ]aK&J\N,+J7ȇWv k9䔩2+g[Lv=k[,`t9$,@AhF@FvؑS.f$_ٌ;:r{Jg6ꁅp0 αŀ'B9yRx&cT[qcDx<Fʶ!%}\G"d,FXiDbD{| >OZ y( s,>П"дd'aZ3_ǰ~5IRiڢ.7U?E`HH]ػ_<=3~g'YO ?ݍnʈ(+gt5=݆5ml ƸH`C^b$Rw 7`J[c7~\cJyM^NN9TXP % 癵ٽ`<)`Ff #J%x r!}U4юkև4 j7T٬HαV֯^J4TEXT8p|وΝMS^RLSHL\=Q!$30tOiix}J'P>I?O!:?K,7<0DdxTC-X]|'Q7S>wn;f6-R}O;-E:C8ͽwEQxR/l;hU7QmvylG! IˁtG:@R8duoNNλo7׹'\[U- qcÃka\G 0?Q[Axuhxg?K!fPf !`u,yPy>QjHq^1"cr -gd)őA`[itKJa}LF Q-:U=례r/)#d/BdO Sa*Ђ.l06d:gә6O޳!y͡pGSn8_Xcs20f X&X| j)&spRr̦UgƔ/Y{d{_3xcu:E_:Edɣ߱7o/o5T4K ƂjAPui"Əq[}.= U=it9͸ 12_"jںL퇣k:$a F?UlOOKRf8X9s Ǩ~gbr@2i#Β|U^O;qca-{t$l%~ # 眍B}R)rZ,Up(%wV`&Έadyb`)}R#T;(u:El7p7=?Bj9+_G Z<J%$ eo`-~:>LӝMN8$Z-(3g9lDˀ=iF?ɜ͵X.{ZT@?$L3'uޞ) 12xӹ$E,4<<;ԪJtr I0me4?*yg$ .Oo^}-4r*5_,QߴO7uh HL2Α:טCK%:LF *|x0?iq†. ު'4XLaQJvv,rvK vJ`4yn?j4.0`F]CK=aL#~ak^1A:(mEtz^ucy7k.,) .!$(u /١ 5}(RG1ԧrD3Yʝ܌'?#xyNm2'^=-K,Nw*Vsv\³| N%Y&ɧ*OsXキsA[p܇j)bMS?Y'bqۓ~Z^iE_% cm7W9>Q Sѝ_Fh_T!8r+ Q!LH/ZO޳' $;hE,# c "N"wQ q4r ǐwEsBdB j(m70A8 f*/q="D1hƕ`4kcnEWƥe?&((!HBMr\$~H|L_hn<:'~ܕb@+<V'c1ЎpKqg%A= &Eޭi #QxQvtl᭣m]'۟jnLԙ.E|<_=ܨ9HƔgML*d<8=(˙RK.恼Zg-U,bdlBx+EGS*wJ,{+d񄟎E ;UZ,NwyI:wdb74[ON>:O#0F8'C qWm?kg[22Efi|~@8st4IƂhȲyrRQ -?0C.b0gL,Ы H ɠ}Bw͹xVD s0c"A a}s6"^aTjx"=^-&2aXt;t?MOaK! @S1qҗd4LTd L13 ׮"zk8i=#yowq):JނSW]̚XEį1nT[<"W5BkԤd'wL[2OF̝fc.p^+f?ae'IIOݷ[v~"Mj3HIEO6ki(,|/#ysMp@ hAW3 \=▱63HѵcwXg<*&/ fBDsH]#Su =mRr>:Y'p Vɯ)Cu>tDRCt:~zv£ Ռ JR3EG ^wD)1i$ȘIFqR=q:0*7\; 0/$վ6:6DQOd0OR"fNf/8JBoڦ}sґ@X* 8:<=9dc`#]e#xȦl܆ Xb:&Р;2a3QĴmL\-(A<(NbU2~.W%U?ϕq#O5LȽ%$Y[\|85>c=I &?1VuuҺqppIo ޛacyI6ve &~րʅFfUr_*h >\@4pA5Dvcb_'8If0)nSuM/.W~t% (s۹¸P|ո#܄gS|(63"+r/ [O:ɨ<<nPѽROGW7oFz?+ r٤O Nk"`.CIv_&-pyѻ#bhɣZ?W7e\tv&K{-X~2IehGaO}uѿ;*f98ykyE^ϚttAt7OIpjqdyה$^&`6ocg|-K)F4%(Tdj3ܩMգJ`4N[U6ɳL3yaw\W3Pf~0Rje?y+z%关eIsBZRt{;$J=zWEMPA!t,i|jv(2hF2WCVCi )ԓOz&h2n]ĖTr6,-;dK 6OdFڲhWZE-JZa"u@upRT1lLt雓czTX`Z=j wQ񨶌W)uCib)\ɧ<1zzJ)L|p~\/OUoЗ2tYO/W0;^pdt% BGx/ ܝ{RN(S^DD%Z&uS,ɞH~ ]7sl;tb?v܂?}}.yhp'ӣD!D ]y~ Žv?]_0ί?DD1Ƴ?W-U'd+B\ cBкWgŁ10PVtD 4S 0fW2S4@a\v( qWzJœF]K9On4&a)99_$.4e2A JGC!Ejp4:i(s):"1xʦcQA:2\I搜tL5.~*jNR剞 }) _L۾MrH)НqW#S#ʴzc1?.تڭ՞zLXrAMo`&{OyI7F S QRU-x.28$[ #DZ&_AHj6MB"|p?T,BUWM̯Aآ e,d:A70 U_j߃ 037+ 0ҌGmc=}||PC ,LY[%Hl~jpOrqyU-NyAö\x fM.g\dY猏b yboS\+֛[ ##fSK+d ilb8i}#GQJ(N+J@~sL#N}tROKwGYeE Kp k~ 'm??~sːsCvC%֠#r)n19l ݫJsG='*tS?<*34R q#' T9n͉ZH>PqUpgdNOn0PԗW8p=uZ0Q_ o?Pi|UFЂ3XDTL]vacmKG)MKMoZLR8(VY|+PwN{!,nmH֏6[6gɧds'ܾϟZ/M}xl#_iGYjfZ)GkzL8 [v1l*`(i[6+t ~ Gi/K%$tнX\%!cY%>Щh+|e"B98B"(8kYB MY Z WnV%eC-%k~N{n<6^@2/nHXEv`FVab4@@9Fr ̈́2Y+4VR@3~L樫I2KaVtלw(&¸BpZ1S"y3cz*/c-/l$5 dV?UT=PY:V :=wr&?:;Q7Pά{DpK:ۭ=3 25J*,TϑDMz[]JE·CAJ?3PwAbdz4+Th' ]b),ldCra?}Z42Q" "N ϧElQȇ 5rK7h]9|{z HIV6:Z ,G+؜V6+BW+LxZR􁡩'5հ/ HEt2!zZ;ϲ &`a5&ƺ5v$P=kؙbDwō5‰|Xῗ9祓C4GZ^vHŪDd8ar{ZX.oO s݇€vV3\GEkE} M{H|OQzOixef5 Ym>@FyEqHPU{A<,KOlNtbj&*Ƴ]kS.@.i2LMfODı@ !&Aix0A~nOdX>.QcrqH;[}AY28_$&f.{ԍ0Q>-PoGy@>Y}e~P;?X\y>hN-oբI*2:p16f9y|1wB48?a6 8Wu;yA~yJ~v!ldDM&ѣ|yFQV<q+R8/؇BQ^*}%дZڍ}A FfDz%[qq.#d6ymx@8 uc@yK8|/Qp$f4^^v& | wd PZZ(axm@ϣ۟no{WC2"q 1B^'6 XТ_[kV!‡=4a\OHTy˃Hd`Fy"$&*A(Ɂ2b(#`;4psظURݸJTyN#BZ|?\ L{mՠ>c.Fj6_`T%̩d,.Ғmq\Jc& fN[K$)\u,LRn~cLF702\Xp Vvt;!\lraxhmd!z]"Ed  "*M EBekp>mbJF5@*z:T1Jrg8"qCO [kaO~D:T~zn?g6wY,x*行Qbtq{uppfj[=o}y#G^HJ bvDJ夬j%##ǥr&bۅJF8&P~+PO3d Ѝϱ]uZc.ȴq0YU'î &c!')#F@YJ ڐ%blx< A$"@.+`_JI^ZbM'=Ff)@N6C+|PI^<NSClɹAтQTHyaYN.cRW%WӜߒjns'k*(Od´ l!ܨ41 B#wpMVBg!}MZ1.iӘKN4ӝb=t&AU`:5#@JnU01Yʸ~_S.o~׿:l"?qCs 1`uoQn; GcS{r7T6sdcZ~e4B@8Ē$@O LEFdSl-۴KJsu[ Qi @/SCdkS-NJxQG[UZEYNmWfbO!:\B+#K l%OWJehJ9|A 5AٺǢcd<1BNz|9[s9DaS6.0d8Χ ?fgs:{N&#;\1t+uLz 9<oI>]5M3EQ(xtȌ πkHReFAn1be~O őP&RBh@<^TK>_d5 3rfj&Bv)3`bЦM/ g)]5bE2bkq7EOMnwhm0Z`- |,‚.P/ 6D!_pppao?ۛwq[CI'^/蓠2G(Cs4*[ˇ3-Niesw/nA ~ JJt/y1y4n;w&P0)w87*1J%ɦA@ o߭ o QX2~մ7Y"yHLHգ5xEv!"E+j E$/,ra`ta|UBWeK{84C0aBܱ(H"Gjb3utzX)xwL?f6GnXGH.: p@N;'-PWXwgW=gw}t^ݎwr03v>RBI'VBYrhK "G+LJ$n!TE/f[ )$'h7g%./w&{cC6ThwtIB0,rЄwbq3b wA-4a(FX{©p! %  jm Z@,o6儕5Dʕ[$XF B״QFx(7 \Kd ^`tCΤGpLGTTKxu o-ZP!yDa1i=f .A摽 *^ͽJOM`7V\ YGM}TOLѳf960 cH.xFGpRpҹF6#{R*%1mںn7;aϑLX|߹aӱ$7@A"deG ɮ}&\R~_#`!{J5(^è%/CH>@1l5:p k M}b 7e7B, f}që{Qugp,@;$?&':yf ŏL$=$_LJ!\"PK Jks9oNc>vRރО%P\sJT(FחK`(L@+٬ƸݰrPX5KծF9' A y&bU%B#f%l93tH7)$4_.Apb8{3/?;9m*XOs 4/"| W!n|BhpTWl uHOTDYPQ^MKR.{i:Qk<~(ޗE%tE3r*gw5n?"C%z&e>0c"U)_Q$RDO0[ew'|_`/]6qr1չ%A LX'Ҋ* BL)9u-C,9=Z 80nxqW=wBYd嫟Zs_V6k,rHtLi1NV4X`MgL?Jo, k;b㸕tZ,GĩN ]L) ;A'Z+Zݛ_9]t1tUأ]e6ԥ"xygL_}NpmgNO !-H|z.>.m-⹑Bhҳ#T,<n$ g<n飯qWJ '}b"SH)x^kf@]tt$i.#LUnDU9,BGl"krqxJ͝Ť۟K!r#ّg4aZEH Cdq`jj^sSlի[Y];Ul3>&b 9}Z\Yo8M]w-ȕ~yy;j#C՛[3?(Be׋8N @1D5qO(N((@"2xa0ez"`kbZ8)N]ΠQV#(L 0AT50;3 E?Fߞ'cZWebJt\XQ0g(bȚҵkPK9HԘr[UӪ{[Gp4VOah(<x{nS~i`r6jIHA ?@m##e11^Fq@ ĵXar tX!&s16 ضqBn6>S:C`WwZs]F } SK{?$BV'S"{T'C8찮ƌeޕQkW//,Fzj8Rr(MSA|ed,*%C_XJd`%1v96z4B _J&M3  YnVakX$,cjJSP>q[S;|ίf/LB,语?FS*q4ħ%PB%j<}yoUs '*}+[~_=RT=ghYB:.y9?#2DϘl)2f3kmh;҃sYM 醭=21\o5JۿW3ҵsxcVe J錥 )ntc.DX1i{qT)kE{2zk'WF XԶȈMw⣇ :ke;!0~iX~!aZ_[$lx%s05= 8Xq\3ptR vG!G1־B4gv:fP݀(Ulw3,xȀ*Z#R Ip䚰q1`\v y$Jš*D${==P#I{G6k0h~FjkƼ%[![*% b(60l{|+%>,^!}F[9t#\I:)D})p^RJbI^V\o-(%RCw$J hqJ!, 5K/[ [rzܔl B42BI".(g{yoU0 Fb0ݱ|w+ݮjHP!b9cr,{06ԍɑ:MƘ/^tASop;"Z_⊎ j,!BBUiBAqit>G?0%3fa[# sl{e+#u3<]ēN,~L|E,C{*:*YXiL폿Ĕy+wepcRRE|.I.j$Z aed&0cŒpe]S έ;{k%4Ȋ{zx;]GKn4cBvau% (u?ڶ\gu652NH`1nۓDEiBh\:A0Ѐ9Rum\](@"a15:6eo%Ay@d(UF503d C t3p*X vA'Z R&9ѥ%ez-a `}v01XSf*he Cת04k?Ͱ4~3sǻ@oSy|h)_bQcN.Sj>Doh2 [,7ptlYiwAzLېM, `f~ HkXs- ԉ`^Dh Pjgaf<>'G[B@/xL{'CKS,قv Q v]NB{j=+%IeN)/_&T=E39} wLN#_V{$-\. +zƊ ¦T/WH|8QC^=]^ c`E0lݭX፷Hm1U|ȷu͸}Q&N!X.dDh±(b{kb" ' :Ő?W<1 qe͛wV:=if۪  r߀G=[7ſJDL8vڰTW!8ƍGvo%kG#qSW%,@O@N'5VSu `K2u1lz't4l\b $y^woSHce1 3ԓٲ*?A%) pIj.A#lh=7J|fj]tGa<|#61Y{x(T.I¸K0IU!s,Zqԝp`"[ r3 e%=j*f+w fVDILlua$KO"ϥdWθTCkՍ}9 -25DEe*p]^4UbC\=YId;eN g#pRhdxT02V@>F@죵BwCZZq/iEπOHqh 9#)#c[_KDIYD?9 yF wNOVGQ\,Ei&*JXl @}#*}@aYb&o~4N !-`<CWyoBN=Vg"5v@ ˚/#Z<Ftm%/I-SX$UlNsK(.m-Eb T@"\w,<6l z֊Ϧ@px$db= ke(sTG?tF~SQ{ʖ V J>\N-Ĉ` %Ppd,l|5d^4RPb# +bl8o?# D$a;:<hGIly7HrBe$@K$(I΀/gw8 Y^5v>S1ܑjG/KE)%~ë&&L{d0 @Q"S+AqR(+o@u8fLYYPAr G#Q,33YQًj@1Yn$6hd|@XHnrڠ稜ɂ=~b!я>x 4sx"9]6uHE6HS͗:ya"#rh3cjHC d- @QCX ڲ `{= jjM_1pc|2&A+|MsZ$ EG}CqO-[e QMj:Xn(-DL}"*l?sJVi'd\` SԵ4H>BIAb?:|Olfà߽ ?]/*aZ氙cAC S\vxp)G+-؉!20қD,b; }u4/Yh$rn]Qó2eEr[U@6p> zL\%y7[,˟ɘpav~C L !xJ{`2D!|ڀʏch@7vclk*I^g9f~7RtqW #^Kj(lU 760(7W'" H5;Bm>\?0=߁6Ǵ|_I}B# g}V|+uxiҊ:PNiή] FKbK7],~5X.WSB1R0;1BO*o,fG.pq(i#L2D,HAi_Y^nhnt͓Hdb5ah&얥΁65h!kӎV;ȮETkL%)ɽ9hܷG.3Buݞ~XJ &"瀢.YbJKh*(*GE%lxhp1<=}I<F 8):}?޽:FNJM|*b$x2j}X {81 {%L iϡ[p *zu!o"&TLYO_SA I_^]k$揰˵[O n 3*QG gS+{EA1J[ q<o t% WAU-6z^j-P''!ȟ3y\`C#(/c-,;y!Ov {?+ɦxS;@&'7@[t ?9k/Y7:{]w>hY~͠g${blg0}8Rn!XpX*<$᪘FLD{K_~K [V [קFG{_G7ë޵RFb?햷д oV<_t1&7qɎTFit6j!QK>@%\F@W,A@;"PҒp@()d?Y>DpU.~bW67b`_ׇWZ'hѫX+(١f5}#c `3Pm>។ dbB–`5G屟(ITv#~s:{ގ%:>\ݼ lrSUD^ dF/ 9_ǪQ)3R'7J @g6J*f{ë́`i ->t8b<Ӏ]Ý}MXSloSGUVS(%z~8zcӉh5TQ:! x1*5]kHVƠK`[zCR ʆ.vƣrY@Qt9ͽA y^BKH 6u|(e/.-bT; &yPNu0B'Ma:Zrii%w _jŊ"0TN|@FGf<.IG_r1 Xk4TBp6nL db99B6io37םb A}s6ZFTRKZBuPC`+*+FV|9y!OƊ;d:B=rL/.J_o_o%h@Sb[HC]sHm#K 5akZ﹉WޒDu} =qa dѨhZ]*}i+՝TpgH: {UAO_fDS.[@+xe9޷\`#.L\l ^RŒ`:< X 8a=A+h`"_R?&K?gtKx[H5A|,'M3}F~h`致d,ad䋈WRڳUe]/<YBJcwl9aK2~8e\5-U7{SPlڔ:{W7ooGo`x߿/[:)S_OFsnHk&~.no^c]IHR$ե)S`XQ~D3NUOnD9 tU4b256ןilCk4本fJ-)E LH.Z;gCԖ 9Qӹ n>pQjw09Pcd)ՙ\_%$W*. S%nz{P2 gf5'ֈP0HE5@Z\UԀ )#6M³c]Dsь8<3Gl٘Osro~hDlTh5>rLc˩SSvb?j Un%2}McTFτ0jKJG%S({rQG`RZN9ՁVRm Q)}L;zL hP%ٹHNpٛo' \X{SʻQ0 q`nނ/ˎ略W=S e^%۞vH{.9i8ͪT^A5*/yާx4{E@8rlVD6ɷP;'Fu?GWa./&ASvF țA%pد)On44e}3w,=-q 6&RF21[iJ Wq qli*`xHXӽ3b I0I \:Nk LH@CMk(<~"(tYκM^fw^h/)^#0)+' 2{"֓P`7yvwvPT %D0^YېPCqs?tmNW&jw\I(-qB4\$ $fe|L} p/ HU?ȟ|.!cz&8/wu&K L x#DMc/l۬^jz ɉ +\ XQm[%rib:d`{ةKD-rJ"u_Zwa/+v 9L' {dZ~b=Y^3թO'#P󦯧<-ԹYG9&Qp0D0:o.}r^N-1L|iT?q0*m[l*Gj8zۻ~k?ߎ¦tw;vb7e`4a+p=AxƝ2/* ^2Ydo)c2#F!%1 nu+yK,ClQN eVcn!a ;GȤl6-/W{wmoxu{Îvtݻg:C}'k\ >ot퀝ߎ{7+W7?.GU`_0x`=F˾$fjT7KשOS=nFp L5*a}iiPZ?)n'S,2`$\Ej;E'1jtYLoT$퓖La2 6Y:׭gّO|!U?q@N5ufCSDl}@Yc$xs%#Gti>S)Qʴx` :׽Zg %  ܻ@.tv5iXxSY0.<תMzJw\fS[pyHcfFAPiz>7ԩQs~: eF]0@A KK8@H- ?.ZA qU^>tK:xx׀$8jOm޷WhGA~b")1wMARG\!g1*VB- w:$x'}9gD i<>@8 ;\(?b`X,}k,U pʘ;瀌[FD"9>~I p/9;E@_hs(r *8M'N39> O)#.zV˲/k0޷© )]g\eCECY][O-"q֟YT98^FF <*eܵGer0_"lYN-g9t"$#ɤmgIt·Zad#%S , [*یqA_b K+Tc_n_1JmAGN^OE0Ot-Gų;!֋,]BO`z[X/cF8)`ꨬpv"ҌͿ6BvoWmV ͣ5J%eB TުO$מ[lT-pStSB7j6Nr0:l Z'$,cRlne:[*/F켼P}0nTpBz?$xcD C롣l|x{߿:}*GI"h♓߻7oEkٻyMs<i\L`bUo =` >pE7SNY+MW We#\Z6'=&M*'ȗƇ)MY<s6kD_F[j\/Zԗw1:pDUؔ=4&rB.ұ˹l1)2 [~9Ms:C2q`r5򛮮tY3n4 d`EY"}K$r Zrxw=Ɂ͔h}2yLnEY2IRp8}6L֕٘2Q F%R],Fq%Ce:^n^(U *'CsE(HB.DB.pj+0= )*a .%$=SlaB#ERhui&ˇ뫋ސxu5 cXn2#iآ::w|v5"'-I_R&oɓAm"M:@revhLl7XO!'|$,ftgRIWzkj), *,C/XY\\B@x2ҚxT;5C̊ ̺Or:4`4&1%:pwn{c5C(n@2<36n9eFNh7Wu,[J!HxHjE+C*0@3YQݫHgͦLQYj1){-TPvYJiN,1)yl?dJ5mxn=Ӵr w/,Kx/yl!VhQ@0#7f*U$+iPJ$Zۄn)%|SF@a "KTv9톾Րfp+ mwѶc"!D:ApDTBd 9tC׏8sCހTX`~(ҿӑ&/+5>/%U zU?x* b{?ʲjx?Xxh!'ӌ6a'sP> E@,߰-:U ؿH {]qw=2b$ ZyXV P*)7 7BhML)k)b9h$%4+Ju*z#vW<ng(r玜bYwyvdRO 6&'o'C Ne{/^<l8(NidWhℝX4^i6 55_$1,3oUE5ز|sD&6CwۇpwcWy7F~0ߏz7V$Kf@`G ZgQ(f+%׈/F/B E!q4շ i/NVʀH#SM3jt Px2ֆ TfPJM'dV54KX FUrJ 9KAMƲ+li EwlH!HK sAAߔGQJp6bbc>deь!\:yL\KZS ,vjOʅZUY ͐grӹUPC/9^ۉPmpx7zRU6'4WX1%"ތ xn(m.rj2dAx16Mc)],Nއ7m"TAG+b$P%/XᗋA#)]B^C吱zT( J_NA&7$QP%[{i9(}02KB5q_/nǵ*F0bnaGLni#:.?i&vPF:!|%$5ʎ#fbZxH{ 8ا$ψ` 3C' L4w4m-Ju/F XX6٥3Gww8UYv71T>J.Fjfud֎MEƾ }O;ۢة2:oЇZO~T=<=a4F5Y>Uq.ٰ[_n흢%i)B4?&>^1]|kX{Měc_I fNJe|V wF +F2(cBt2dzox]X2 ww0s[q)M妐%nGmd$2O:qma S uؔx8s~z&*xƩޡs檟AHu`Ex:X<ϴͳ0PեzS4+!w/: `B4LsQ'hFz("|ݷ4z_qaTGV/;`̄;v]de 4P5!̛OɋP[!ߵdXϽ~[BonIY1XxNVcF\ŕ<XJ2%I l#|ߪGHb‡\y6N4.r E9?_AsWX_EWdϐЯ/,L{9ϠUeVЉѝs4Z3OK\'jdǴ$(ۧ2qw,^|r(K 846qE/5Z')C"P f4ɴn/׵g !k2mzK )5U{(}}AD0qqK JUgUP&hJX݆*TeV\`5؀NON|{ҒE=?'ic7Xq)Rz iƢfFس=>=fu,4=["&m#"[_o4#nhif_ DtiSIo%:7ӡ#⣺:ʔ{қ͐B?;" Y3QUgVLyXmmtޟD_[?2j(.zgeR3:>YCJAnP)XyE<.SE*zL2%J?srGy5R4k:_f4O[ZNkϗqL /񻸲&t7rj'C#ؒ6(SG8 PJ'l4U.U|ݡ%Kh*UYZ+j4!)H$?U"50{J4:O;rZCF&}[Um ?, sؿj(Hg`g` 5bv XLۣd}s G2Y%gQ)u;K GvZͻibhn<ں-G UTCkD!6GjB pφ'ω֊{EaE zTHm}Pe0A $aWkm"0j$Q ̾AA|8 zNV/U1V}I-!s2yD>]bQi1=6>zi;g(0xǤMb>l$^GQecZ&n9)a}$_- @8* k3=>c+P23ˉ|?|{9z 7EEbbDPlV S?9f(fk+UW !g;ySfT o,VI #3nY~1)[^- MYyrx9&.gR9 {X ctG&G7{=ڸ!A)aا\;5V;9T5 Y"=:zs ! N^RO"W"c}~(tƄ/ dZaI^`Q%/F>#(*HW cH4gi#F;hw4r?@(M9.R{R4GW/ѫ|o謐]QǍq3WCvW~*k5-q-jmg}t!.ofh9$ N_ଇ7H \IwE Cd$'6 yה$^ $ܭ(='濠nxrM/~ lQkz^Ot us_%2hopGƆA)R0;]`KFw!V_&|h1c3XND*G*}!*ܫǝ.>w6 K2#(A CҎY3%tRTkELLكicZr~8%,ՒlNsu֨ \6B6z Gwiw/JX$4j6r+lA5!wAzGv+Kqࡈ#< ^Ekˆ{d8, ,9 7ldT}W&:>S@[BײYIXg-X"kD:dįe*L֨K}$ {I꧔-lMĔv`$K']U|d09r+P(Zea̗mG X"osi PНAo6"|J &;\w-Y ܅A+!׌Vm(3wF5C X g7-)SbO_ۓlOx7lו>.պB v7,{n 'zV&4.O|."bfqo!bvR F[p'T%j&0SgzG('46›ǯۑXWT"Yyq<(\gj%1ޭzxtZLyS7MA ݲDHn=Lq)YYYmg677{ģ9GK'FWdB d^exk@)xS@7N|C%ԗ[GhWC`[FU mGӐ=f5Gs|v"Etl'zci^]k3}1hfL9YzlkMF%(엊D<žIl+ФcVG-Msck['= RU'ggwxo\K!;63DeK {NKe/W?xPQpIc =Ҽ(QV'blDK(6bvkyB IWP+~!πozTK'N őFW?/ *%I`fyLT|ڛVٴl! vT"3HC)-_֗.7Ψ'!7ϻ*\Ig}> y_ 88UVMrw뼆Z5k$Z}6kZP$Jp.]UK#M,aY W0Gjk׶]*8cXL"Wj>xUX?a#bH8LZ>_!jR&3%NepD#FSW{TA@x7UJLZqWc`tgX8i&ğ%c9/&`q2B1\TŚjTH*WEZU`%5n$@\f3^oD@`uz\US0SNu[A"_ٯnH8Ys5x'?pa{^GHLEF^Sk5Eh۹Z@xfT a!2T:2VD_l`o YC1/@ؑD~qo{zTN6BtS$m$b0R8N<ߎi_1O}A '4o}HWSʌ)seq?*fӵ`K}NY״IkR\Mr5c+B`]y ޒr>Ijv8ēP.vYM PJ,Md$/lqeۚɤPzŽpm^5x0哘>8VB6 aQ# ׶ v G,fNn-8h?0:P{#&1Xkc_3^8&r_ZTaɖ2ϸMvu#lg/Bes%Ռ&A%7i+Mk:F71T큘)"~̼͛31`E|psy9q 钙kH>jֿ?e1\4wLCoۧgƤpE)';ۉxmoGվ`Ʀ6վ`5BTªmصڶIA1!$v!נ1oQ&T7ck7\.%d7x5LZ L4Zi [POl^jiG58F3`AZs Tdhڍyo6` {3( !lVUvNRy;,&_nܾ~W9wmTvt*{j|d@_c=0T_vԵu {]T081|M\ tR3X*-tӝOtâv? "&"ǃǤNK|qU39KXсId$?]h 'AS-[KDze#(Qm$&k_quI2!Wyk ΁b1` j2lSM6~``2<jE@H >mlU_XhBt5?f"#.4=UZ7 pVJeql f"r|QRSm'pWJBd8h?ð QHxKN+@~"b4fhEZvML<8ez5'ۍDM#,1.i|VmpiOI--^~\Ŋp'i /T#H1kӋ'YKĵglV)&q*cb")]aMU~dB9g0?BCxL=fWG96Cv|:tVރG_߬]{N~W !eWV|/2zf7yZf/ EAt 1wTutLqy춿Ol GX~cBe+,&%0 *=ų'*`P1gĸwtr߫k0 wmO&Gb!WHlr*Ø֍Tb8ƃňc| O;BWީVoyE 7Nkg2 Ԃ& iݞ!J"ШW}{W7?B SHB?LVb4_cQY6^.qDeAm 5݇e8BEǮk[9D0A>=о*W p(jh"to4dE39Ʃ? /o) 3"g/Rn\pK()weOu}'$ wYKT5gwKkO)iNCF[Ntg\Bv0ohPMF@q8%;;­v:Z{oԩ@՝P"Rz(=CWP̔ҵ6 O & Ic< zoN|}4>F|6e[kQTαxiBk;˛x(jf!їgƒbPY#4^#F,߹'-3'w)𢡄y;^Y3~t,';$Ar@\s(/lZ*^|qGNWCR gOy!ئ4Vtz0]VhC:;=jX914I׿OYb₝!V8—\KIr\ޑB("gV:Ujh-"h>!er{,1+L$3-3A{U|ďqzhD?`F d6iBƘ'gT KơSyY2vc 7˳~6}_e حG{_([J;/3Ǟt~9эoI~J'I EOĴHT!pފẗ́PW'My Mz*>Džv$,Cb%1cRҹQ.Y~'AO_on1cۅ̂L)fb?ȟ<`%ϳBy31~e74-r~cP !A3bqE\&Ӆ-0oh>Kyr_U@,XgB5["jヒGZ[iNB\(μҾogS_KⓌ0ڢlN-響/ۏy@\}KcWZ Y5ЖViU"0B #i>m\LfWA%1?dIuhB{Бēͳ9!Ν2 _"E;timE>^=燩4pٱ K~҂4Z|X0M wyYrަB\pU 7oHϫUe٤2!/'VBc?WY<: 3I $J[dmH&C}HK7巹a] && aYO(#L˳s~ԌeX2c QqAWr&hz ݚ@P+}d3sbHe QQ{-J!22>Em*]rk5A:UWCʦP%b ɔlpi! Z#{RDTqCenf*מZ 0Fv Xm -]npž5[puWŀhvo;/D^|ͥ)x i2\#bV߅Wcp}BvƄv-?[rdt_fdG<[<\nNyXH>SoV$Y|أٿNmUz,Mf57 Zz(@3SUd("?@#wJyECXY+e*z|% ԇ,L^S25uA6ڣU56;ԗƆS*Ef:,k{<>,QzCae,²;~M1A~HNuS WQ\R9Ș{G2 Ōj4|X(!s ?2Jh!۠ eZP|hNƌt@XcH!}J2bRN]%YaSԲ%K'ZF.-Skm_PyɅbj*@0&-y3fTW ҟΨPE >7H՚îYwMEY&a\co/#fe3V-MPiEl΃5C`~ pip 0R RmL@BlB00`B/ !$Y_W$C rS)g [d*Cbj-s\Wu3u4DTƈt ZL?Õ̱cYqH1԰P <xuܵe6oKJ>OlOHtU/nGW7ѠAB > f d"M6)ء/K# PK M&7JMTHK'm};[_`< fe-\Nm5_vs%+cE]̃jRB٭%B!s006L@'@D! ^SIl+{b/+4(]O4SNw?|.{3œ/_Ub_"+t.;9VJ`K3/xB^L\%;} jc\c-nAZB_.g  H$e 'pKs3}$߸RZz'@KhKp ?=c![)46T#g%`ZڰuDtymla ߵ._Āc 1=cGjk +@upJ@Ok41>v/b!Do`]P}e@8|rM/M#ctxJRh'O4nVȫشq|W鲀3 [ND ƅDACMl3d*A=Wxem!"x6˥f/ Bok/3y Z3Ȭ ٴb`1ƒ,5\3MZO߳-WL~"0AP*L!-#Zpe}Fo~:Bb?\Pa[ʠMqf cTs~.r g!D؃6!,v_R`AǨ _W1V6GSP!]tg5(u:'KBS UE$Zk^   v/JڱKy=y.X X) XߜC"ʏht:ԆAڂh&wU h^6[E4; S2^Ӂ4Nlmj6*,ݝ{ƾz'`z%Fktx`,FRz,{ &&!@lي26 0|D=99`XdI5G&Bb-x t+k/᤺ifIZtTx 9NE+#+-N)O+\.LTZMb,^.?4?4p j,Ho%]HKty0@`x:gQm`_;3EjS +_g# Sh kcmb_ eKtAl1* ?<3K:N[}æԛW&Q[m0p^lîf$d84;`Hۍ#QV"&:.zDaPHs=p>ȿ0w~!g0 d ]gC7]_XzUKw)x-n FZҥFk ,eUݥL(X {Y?BXy%bLC!$_4{EjĤn0$Tr1gVI_k7ë~G^"bS-9.H h2&O⹁F(=EHa{XH{j1M:HoV ?P!њ޼G 8C#8WWmɫNٮx]9oכK-TO[40| n0T~u9AXF;at}n1ǀ87ܚ~+oP< C8kPXM_ʢ%z[0$ 1Y$1w MM>#_Q\XE%|$PV/ f]kLAژ%)"S_t>gۧU e>w4&>AmP Ս!=*p(ÀH.ԙ#K]i)gR"P&N33tusz7~ .ӿqWlȝWyZB2Z#8BaP5#۠!Fy58}~#ί7(iJ @jN1!x>FCtw4Gh$qxPH?c֢o4:: NzYw0{i) 7ϜgYUά#l7o~㮥 CD|Ɲuӵi;34Xj"[A)JZlX0jnKUHB38-7D3u-L7>k5./8bD Xx"~V)M/70ƅWt?w]4M`:BNQ[+DZ3iFã v(Qe8Dz*#̸6JA PP]s1,ך>nu_ GYBQC:ŔȠ_l7{':6y^ckp ALEסfD5gYõ7!pWl9+Js6;N;Vs];sXBMOutS`f&[MURU@TsL)FaB T j2f[3'{o r+T&I26l}8pC1F5`r _vMid.vnu:GmVaGߒ-`iigDyXDdGP]ˤ胓8^]`ZG6'+' %Zt@_cg%;_TG;iؠ C_լrӶZ*/=& W{hXE&[Ӣ?"ml V.e|YAylZ콐2Fg}*g7Lh .JHm2' CI /ZB^(-X`Cz=7ģ7M.'2N=|g츆Mb#^A1+@U?'@csYDv:Bggmn/I˒ɦqbY8-ǐD8&ݯ2|bk+S1 X$Ѧ_V咲D %ƸJ/@eTKtqО98e40\q$1 b1+ 0;8LL8@*n3/)S%[0)p~to9=yk ?b=:Fri؍c ־ዀ$h}0_h~xHM譖 {a!;Ε|,I/2սh':=4B7t)3HT\9jJ=wa-K'oL#o9O_ƊY9`Z$fsԀL]a۷׬hx{߿h7_/WaOC{)A$YcNc.*E!j#o4%Z2S~n5[i'?&1M-Eܧw#eKnq9}党{uo'm^[%pm3S[xw9@)ODq?PGtdbI/R<C ̱^Q4Lr nO t 3G\Yu(F> @\Q M$OR-bPоO>&@rXuR 7߄^G...w@ YtHFhZ6Zj JyIx{"5 hc*s ltŊ\@? T^矾R.{7JTt}5oFwc*TM_ُUeͻ޻&# F=|Bs94dE\0Y<,g~Eh2Fa0a p]-Ԋ&iъV"Ed瘉A[PPzX;i~o8Wk<,nj/X|bb^e.1JR3Ḱ9Cl2.OVF>$Jif5>>unK] Ao>E桀xaUT K}=Z$"h֬b)in37ەʘj \Gm|GެQߵݭu.)Gc 鸳\sYq!Υ~DO5n.J=d㊧(#8GMmcj\ 8ȥҿX!7o &bßdh$t'Af,պ^*)vGEr$w^uIӒ0y5S9kvTjXf RcB:ȇzǩFpOE͇>el1X=Ӹj+lI-mLf7F| [ՁsAJ *]?gw3YZ% NQd{Ŭ P16e_gcL t@ V ~ZKNZ|Mk_#~}CV8Bɾ&jXaҷ֏Tq =>Re7xSiw^>׌f->OwLЎY{uo7P jD+F L #=[WT1{]Gm7yb,;"5MHd sa uoф!z=ækzַ3u% /Վ\+i{cOS~gnL`1 PHDDd^p,n]m(Ic`UӤL<^ϡfpDTb*E=XRka/lhZsxnI{(OAH hst縠lxB)<+AmtwRqkz$_\=k u Vd9ޯ?pc;U# fa#ȗ-xi@=~EIr) М9Oo՛^x+iV˰ o|S$[3f@4٬bd t$11݆՝X(}Ǐvx$u?{rWcd,tYJƦf/zr9hF!<kύgYvkӱɴ;f|סJp`"&,oǤn~J54^-۸m4l8:;sͺ7, EQUe } s 뺕mMЀ5k#HV<"=wͯ7z5I?{/70꿿ŝXa U-(X!)c5%*7 .xG_}0z1Ķ\@g^'D5PU. lpw7$g0!Nkl%^ RuǴNVɸ˚F PXl\?2FvjK{LhqVkfxo͗ sE׻:UHЖv-ܹ#me\9ْCזmmk[QEBs*B%*)`DE^2&Q|Z;i (߯ع35<8:zn<|tr^ۣG6eGܿF"tOVg☆:&ujx~e1|H7o47ւJsFcrm \e|^D+J:VpwMx6PO*4Tr'+(ΏY[Djui&]Ůa*& D_FM|#DJ/ "Y‰e;fAyg¡n0fAJWL XR0Dh(S[k@:(.f2_@̙ q P.n\Všs5'4r1/aVAHYURpZCU`*=gha壇+oH"㚨7nc%Ycf<,IKZ1W 1zGTDW}'$"=S7J/Pj6y* ~c<["W7$T(FWp,mi7@EW ~~'þ'Vh%_9\~O1#})YX5pCIL6qj5aKڈ4epkgxgC4ll&:uRkIe~mo;$I3[oshMYP\0z;F팍ro#d؁x tb˅]&3ND'gQkc 8D׏`V8'Iq .K!N&&l\!<`.@|T\=%)i 6·J&1>ax4O>t fW%I>wrE 3}mrQK0˟)1w&\|ff*V&N҂أiL1a4STzѼWn+/xPMPwV&(Fܚ 'o,)Fg,1yfEL}ԨV?t`R&7`ZZL  "Nl``{bESTH|&=Ep"B:' _>&Mg% F'ةLAw{bZ8gQ«IBPdi8HaqV@zak~ Y'pǸXDN!S$#'&FKU"WXT\}i=C4:0`r0f-yB)3KpV]wcZUk8$}zZ~r*8X lfyi.~]?}v*"AB=ӊ@J3U>'I'T ŀ@KJ{u$;|F[\ ͒ o#Aw$Q\X3J6ӹ:Ԯc<7¿A2-TF{pGCol_fG߱ $D~˕QW*(פ.Ueejx!yv/fiLMLVg&S#a,%2C[-fO+m/?3iET>!L0ؚ9.yOpK6G(yghaǀtx)H[1\D(%??ugBnZxj=4l1)9 at<!mt~u DG ak<^Oqo;SASX`%R:w׼^o)iиLs7MhggXi(|w kVPO5H!rt}.l襑ku979G$ ID̨J戵geGCLT\=emثF+ v/4C]l%8=P'^<whJ\pw8N PC#*)^rYp0\8d-Ia3IJi ב1ӗ"Ya\1ӧt1g)n-L'B*5vxƒ܄ e 4` Q`ʭ>||n¾4J^j1i 1 IqcRf:80R/˕:ejv]3M1LJ `GψjƳ1F/61_?Rlz| .@[aόʯa/rOO7n TB d?4=(U-\ZE7 ?ˬ76u2ğ`mxoM822ws!x$-L'MS ά}T]ߑfKli䔼hپf=hXw|~5C~nLu;DCp\iCbI2q3p e-fj(j$%0xMGN3\Z+JȖ5U 5V7궳/26j)0*1TFm][p-FQZyslOJZHbI^ BwzL1ъ XMak}p4> Bh:=;IuIIQzd1耯tƝ0r{3Ej).oO"Ꭶr:+Yh(d"zi*V'\;e6:gvic>F7ld6[;"W&6}Ͱc8bUIp z٨Eu s:6-)fBA/=lqL݂;#Pmz8>\u&T \JEHir]6%quNVͲɊOUSw:a~FxUtMv]:-{x{7ZpK"Q7 t/zw`}i5 ݘs!,KM>L(xbyln╠D)BJYc(dR4kɴ#% c=(RhxeīsbJW%<΄tMr6 ߁jߋQvvםwlz{K߃h[r1w2F:+VNʐa1y V@ ,^ HXS/Q*e88:):(tET0tbֲ?V;Ņ5[ol=& ߃$[ ۆik.&}N˺5wՒY$G8C"=/^ɾ>-^jň}y A|* R1I+ zR^n:9,!QA/"bH9`}Ҁ"Htʢ36a&8~u-o}cgy>b&<^S c !95z}Xy綴S dl@Tj~;F!p þqaf,cCT~g#"lUk D:~ 5/֍c䯰-lXZغJYU"#p_QsD&#U`U=hdI}.K:ROR$^6@jFZ#` C|2)D._F) (K炪TZmGp\-OKlI7h {=`%oDR;|fv-X E>mgI?4J0V"6r*! 7iHA Yq布^d)5ijpg]qBA0!]~sؿQEy2@P8vmOu<&Wh͝ZEƅ[7L7V>[ѳ.*X(B?9Ho5[UȄ gE\We9M 9c$vfI/&#h/L@4WrOt=F|Z`h|/c6?QilFYgO{@ceYf.+X Yח]J߈Ō1#nTi;1j/u創 h&ӴV| N/Urtݿ0_0gy)c"TW TQlqǞиq$H.NHP{e-7 *Qexs 1ݯ)5T^GlOk׽a⏾ȳsaZ?bM)jHTv{oi5 N>ȍe1{nkkb# v KzQz2lۆb7wM8mߥp٠M##IPWKw(\]j8fק3-(a9Z(j cihPjX-)(B ZdA3d%JՍ&-kP=_#uDKcנ4qXN òk s{%]{Imc"6 L4]y#FPLd` /Ue!j@/.bwq6=zs78ΟU#Dգr !.Up)$p`pEx"ݟAts>3X{3>5~6{ȑ$u: nmtkj֎^'QPM,Nݚoߌ̬Ȫ" +G>@TJ:* AE .gjiDP۲xR^~pUYQCjAs7g@0%3M"b2_+kHaLpfGU^Fjp#)VM/'"Mvj=r|1х'<&c"nq ped<ܡ=y:fg'\_t$>>RivdeFɂq@C@܁0>zcGuNPz/hx#ƪZouUv͘>.QNF[Ю/\>DvSޥg^q; ϥd)0$t!Q"TߎN >KJ#ގ־ <.z|9.XX'$i ?_^,N)(HtragT-hMsmvO;gy&yVPˡz=ӏWM ^aƒE֛h.~yKJy(QF=Fm \ljդ&\)to 27 cYNȯE7^Ɣ? \lӋB$fqIɿU$ sM}))D _ɻ :kBW>$S@|Um,|3 )iSGgyլY:Y6_mcVVh9}>:1E**8*\D $04'X'nZ=K Srb&f|)ˀ=Mpx}AI&0wُX{l"Olѱx;S$S#tç!{=l9`3{׷ A%bؿ@ OfEl DZ^Q^|N߱f#Nlev1|4|2,ˢΙC(z(9BA$['Vޔ152!l ´w 2<}o]kHĪAg68P0/ lX'u5W<Ȱr 2NČM#H2ke=ؘ>{M@mwY3Ž݉qaac4CߞD-gRJXb_jNW (8VE2xC ØX&9 ?5:3[ӁY{vk&oF8Fq>O~ǎ~ 3H}s|NÜ/!4{'o0LȆ6wt'O- l^kWe6(/BtysP}M=j+r U'*Ɛ)q<ije|PQMk|0!l.|$zЧ8'@  iN~}\g'@ߕ儸@~4UdޠB+}2*\MZX 3i1XABN\4fjePskkhbcޖlgӹAR)K&F蹏X. R;=x~wzaUM])ÅMl9B0(]WU 4פohcG<5U?ݬgJB6y]sg&2GgxzbYEaIw0[/.y쯯E&39A,>*}[U(NAݳ2}v).V 0خqb ]iگW q0, @3P5mQ< o0˼Ƈ&~Zֵؘ,۔DUIUMu.%XEPf#-̿9o$g!bc'=rrw}qjx~(ޢԅWL ׳\̬HfC0L7}O[BRMQrn^v F讶絰@(Pƪ6Q`;%~QDžNv3p  |;S5%bYzsnW%8Y|ʙeƧ'U/Gt4H^@ R;$ fV|Flc a4L=K쬹8[TjZ+FKqӆu,;aJԑ"8͢a7ņA,1 ߐ͝o9[@>j"4ƽ7lDjT=5==…4O%Hm[~;Mϯ&^J mDG&JW s;=_ֶڦp؋*|aǺBe.nՅ5Kv$zGeN|[/24Q _eu)=ZSD?Ɲiz;N/,8o׋Ea99f -{W,/BrpJ<3`T h# .󹒽uzA|gl#W#GJ>TS4to{5?-9DLO^_ jd)*Bm`І/o+i H. hXޣw)Z%[3`LpHķiȡQԱ0l0^;Kd_Q-0rd&ǎ^ڿܾW eP\,F]iEqjC62qFҺ 6rO*QYdKD0\'{9́~1z¦̫IY>b99"[vZM*\+|C*oo`f"дi-dzT9KUf!bkca%"R,UL,"\<N\̪N3A>.nӅbj61Af +cV‹!>xsHS;bnCD#Ih%[7O:u9Jf0w4*N-#h"ٶ(N]u63Z*^^l@1nl@w\dC{<˧SE AhqFVŔ)Cnu}|aR#Jxc@P2cx IG6u!3ҩUL1@]Cu`|dtsw7==]HFGb4-eds]<#.18;4Dثqe;>]Te2B.>zln8/m[m>1Fxs kFXO. BtD3W'3.) mٱNJZ{% ngw?Fy#gΚ}8q0%iͫ4<}-nG#+_Fvtte!1--I2s8:D*6mslqT;ɜ8NJgtUe}i u]XXvǩ}e(ӀjP̙bo7tץ(0TecB}tڊTaH B n䄧B 7#`ng74tM V I9ccװqq@uut{كNC^?Ѩ'nNrmǽEDMt&zS26)(A&?p >&RokzX4kV/I< (޳UBί}E(R#Dݢճ3#'DDtv.KȠCtXzt2cW{'@$i*Dh pGϕ(Α%5ZunҼDկJznW!Zt`YL{ 5g<Ŏ1 ;9:%U@R>$xat9[;2jY"J, p3dzqkV:[:/Ei먶r)M(Gp՘SSe˸!O\= 9]%WREL?*,6@~7xkw^gKJRh)A?̹U<o`Ab!L6Άi47p bf" %$W :RSIr4ixwws)U_k"2X ry](tIz* :|ӛ)`o,Ew0\OG|qNytr* RtZSwrE( ۳C{4y[pF*!&4*x[|ʛi6q֡aX8ӆiڏ,<]'<5 KC+;'eQW` jSxJ(xsK߂hlJjMcl"VE]23c % K3 ޹gO;$kT NRXxU|$Ֆ흃 tsim5.?fg:a.Ek:)wu?L^hߥy>'4X `I8 /V 6Gy>Mۊ%}Z׶:x[ dq3~GAB,#!g>fTVuwΘp삻rO8s"f~0y!V5350oSߘ\W e*fȬ كWR^&b]WnS82s1c-6=b`u&΅Nb, Ž(/uHGlVs  4W̤ |ڧLhߨo.T~=Yw9,zZ|)*@CaU u$˴}7aU㝸lONsX}4gmS%[ڲ8BiL5L R v(|VW[rɡg`Bn/ L<-7ye* ,Gyrz{,qY{[pĬ`fܼov8:ҲXjjSՙc?yxz튶T~I4ObOXWɼ NC0I#O\Ob ;SqtYPzڔ:I*5\e|Bdl2<3wWR{Lb}uf׉GoEE]`@وcz&2m*^Toёk9Hיt= BA萕wޝ=ʐ4@ZraE[(mub<;:rveVhls 0kT'{G9q~){08V?>xpd΃~c1$ra'#\^G3fHqC4d ѸYira=):ӫk1K6}D"ҫ]r@t2~π:KQV/:UJ\lEۂ/zv4/`,'΂_6՚[j0#i4ZcuH$qDdu>@zmRF 'ZՊ'Gm?.[L,ŁXvѤDY.$1*M&73ݸ /-TD j?hIA#SNQkVy 嗱Jp=B1jdWxp:|nC&dkM]Hw3_;T Wsh`g9 jdEAc`PH4ʋO P;26a;}󇳱=O9o%Nao'EFb"mFN}#-fo+F1lK>TCzV0HJ*RNQZI4hL:\ T2o>9 V6K?嘊,ЙWư+SHbErtd4͚אE$,w/#?`,ӉbyݒLX6n( [Ѐ\m}rfAFd+x)D!X_ MHEHa\+MʮX= WXKԋgXoEdآA3eW'e)&cNd^^W&Y6hXLVS6Db n%&hVW-z1b,,cNi9ayuqyy3NܠQT=8cmBdWzFϔW52މgeĔ1Xo _{0XjrAg0Ҩ+EH3n ˜{=D[ ya% f81=DRCVȝ{0UL\jr&~AK1xJHJm (A7HGo8ڵ\JH̅LC}:Q="Q3:46 G(KKBw?P*MڏYml-;+ޓ rVP/[nӸ6ܰ=֤&Ɛa##%u**_0//*]f]W{]S6T3T!Ne*E)vw^͞Yc0;}trcW8qA aZI_Ya B,ꬲ e8D S+t.厪WeJ~q!pxN*(KM"h.MY<فg`'5ԩ 69 ,/N R^, d]'Z@D=3u $Q(\D<*I3(83@B857ȏd W LiMbi2܂ B{C̆N~? ?vCF=#嗵VOJ!Їq' '=]{8»A6tІ6Ku, LZ_1E(ـ$z|PndԲzڌW.F]T1le_s=[+u0WOM3DB645:Z̄kcBE&%_E(QviKВ%sALT7Q3o1 _ԍj (~˳w/h+yu9Bć ?;]"U*JI<HuL5Ԡ~`Ӯ5u9/:m+P|F^V Rznkoy #EP6(nCR #W./ΤH8)7C5UY W|?G/s44s.Oy?յ`GˡUD4xY5yaĭZg&]D5ta Ât$RMU^!PvY5 <^ur0NžNbs:n 9\֩Nek1YyHizõ=6_Xnt:U;?]bp#_BX/lerqmCC.aE'Ÿ0٫ƺ5AJ_@s>5 Q>d9p76k,5< U URs(]}8o~8ÚF'C u2 X'ʤE<V1ʣZatcr]KYW"6"tQ<!tboGT@9eܹ4S~UKKM+Њ݅I1߬I=Ph׭! y/س5 w4+7y{PW&Tss߃ `臫Tmf';,0C)#3:/5OI 1Ԕ} *u-DQP"n{jNkpd_V)?nLx.9HkNJzpLJUq2u8ӘT*uʚ\T'naria2-1.33.1/test/filelist2.txt0000644000175000017500000000004213200575774013141 00000000000000http://fromfile1 http://fromfile2 aria2-1.33.1/test/filelist1.txt0000644000175000017500000000023013200575774013137 00000000000000# comment line http://localhost/index.html http://localhost2/index.html ftp://localhost/aria2.tar.bz2 dir=/tmp # comment line out=chunky_chocolate aria2-1.33.1/test/file3r.txt0000644000175000017500000000000313200575774012425 00000000000000MNOaria2-1.33.1/test/file2r.txt0000644000175000017500000000000713200575774012430 00000000000000FGHIJKLaria2-1.33.1/test/file1r.txt0000644000175000017500000000001713200575774012430 000000000000001234567890ABCDEaria2-1.33.1/test/emptyfile0000644000175000017500000000000013200575774012416 00000000000000aria2-1.33.1/test/chromium_cookies.sqlite0000644000175000017500000000600013200575774015265 00000000000000SQLite format 3@  - #tablecookiescookiesCREATE TABLE cookies (creation_utc INTEGER NOT NULL UNIQUE PRIMARY KEY,host_key TEXT NOT NULL,name TEXT NOT NULL,value TEXT NOT NULL,path TEXT NOT NULL,expires_utc INTEGER NOT NULL,secure INTEGER NOT NULL,httponly INTEGER NOT NULL,last_access_utc INTEGER NOT NULL)-Aindexsqlite_autoindex_cookies_1cookies K0 #192.168.0.1keyvalue/0Hv)^VE 5aria2.sourceforge.jpmyseckeypass2/profile)^H@)^V< 9.aria2.sourceforge.netmykeypass/)iмU)^V0  }}aria2-1.33.1/test/cookies.sqlite0000644000175000017500000000400013200575774013360 00000000000000SQLite format 3@ - 11L##_tablemoz_cookiesmoz_cookiesCREATE TABLE moz_cookies (id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER) `65 5foobar.overflow.time_t.org/path/toT ( +uid.null_value.com/path/to "% keyvaluebad.pathfoo $ barnoname/path/toT / !JSESSIONID123456789localhost/ aria2-1.33.1/test/chunkChecksumTestFile250.txt0000644000175000017500000000037213200575774015734 000000000000000123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789ABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJABCDEFGHIJabcdefghijabcdefghijabcdefghijabcdefghijabcdefghijaria2-1.33.1/test/4096chunk.txt0000644000175000017500000001000013200575774012672 00000000000000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAaria2-1.33.1/test/Aria2ApiTest.cc0000644000175000017500000002054513200575774013254 00000000000000#include "aria2api.h" #include #include "TestUtil.h" #include "prefs.h" #include "OptionParser.h" #include "OptionHandler.h" #include "RequestGroupMan.h" #include "Context.h" #include "MultiUrlRequestInfo.h" #include "DownloadEngine.h" #include "Option.h" namespace aria2 { class Aria2ApiTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(Aria2ApiTest); CPPUNIT_TEST(testAddUri); CPPUNIT_TEST(testAddMetalink); CPPUNIT_TEST(testAddTorrent); CPPUNIT_TEST(testRemovePause); CPPUNIT_TEST(testChangePosition); CPPUNIT_TEST(testChangeOption); CPPUNIT_TEST(testChangeGlobalOption); CPPUNIT_TEST(testDownloadResultDH); CPPUNIT_TEST_SUITE_END(); Session* session_; public: void setUp() { SessionConfig config; KeyVals options = {{"no-conf", "true"}}; session_ = sessionNew(options, config); } void tearDown() { sessionFinal(session_); } void testAddUri(); void testAddMetalink(); void testAddTorrent(); void testRemovePause(); void testChangePosition(); void testChangeOption(); void testChangeGlobalOption(); void testDownloadResultDH(); }; CPPUNIT_TEST_SUITE_REGISTRATION(Aria2ApiTest); void Aria2ApiTest::testAddUri() { A2Gid gid; std::vector uris(1); KeyVals options; uris[0] = "http://localhost/1"; CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options)); CPPUNIT_ASSERT(!isNull(gid)); DownloadHandle* hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT(hd); CPPUNIT_ASSERT_EQUAL(1, hd->getNumFiles()); FileData file = hd->getFile(1); CPPUNIT_ASSERT_EQUAL((size_t)1, file.uris.size()); CPPUNIT_ASSERT_EQUAL(uris[0], file.uris[0].uri); deleteDownloadHandle(hd); options.push_back(KeyVals::value_type("file-allocation", "foo")); CPPUNIT_ASSERT_EQUAL(-1, addUri(session_, &gid, uris, options)); } void Aria2ApiTest::testAddMetalink() { std::string metalinkPath = A2_TEST_DIR "/metalink4.xml"; std::vector gids; KeyVals options; #ifdef ENABLE_METALINK CPPUNIT_ASSERT_EQUAL(0, addMetalink(session_, &gids, metalinkPath, options)); #ifdef ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL((size_t)2, gids.size()); #else // !ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL((size_t)1, gids.size()); #endif // !ENABLE_BITTORRENT gids.clear(); options.push_back(KeyVals::value_type("file-allocation", "foo")); CPPUNIT_ASSERT_EQUAL(-1, addMetalink(session_, &gids, metalinkPath, options)); #else // !ENABLE_METALINK CPPUNIT_ASSERT_EQUAL(-1, addMetalink(session_, &gids, metalinkPath, options)); #endif // !ENABLE_METALINK } void Aria2ApiTest::testAddTorrent() { std::string torrentPath = A2_TEST_DIR "/test.torrent"; A2Gid gid; KeyVals options; #ifdef ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL(0, addTorrent(session_, &gid, torrentPath, options)); CPPUNIT_ASSERT(!isNull(gid)); options.push_back(KeyVals::value_type("file-allocation", "foo")); CPPUNIT_ASSERT_EQUAL(-1, addTorrent(session_, &gid, torrentPath, options)); #else // !ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL(-1, addTorrent(session_, &gid, torrentPath, options)); #endif // !ENABLE_BITTORRENT } void Aria2ApiTest::testRemovePause() { A2Gid gid; std::vector uris(1); KeyVals options; uris[0] = "http://localhost/1"; CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options)); DownloadHandle* hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT(hd); CPPUNIT_ASSERT_EQUAL(DOWNLOAD_WAITING, hd->getStatus()); deleteDownloadHandle(hd); CPPUNIT_ASSERT_EQUAL(-1, pauseDownload(session_, (A2Gid)0)); CPPUNIT_ASSERT_EQUAL(0, pauseDownload(session_, gid)); hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT(hd); CPPUNIT_ASSERT_EQUAL(DOWNLOAD_PAUSED, hd->getStatus()); deleteDownloadHandle(hd); CPPUNIT_ASSERT_EQUAL(-1, unpauseDownload(session_, (A2Gid)0)); CPPUNIT_ASSERT_EQUAL(0, unpauseDownload(session_, gid)); hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT(hd); CPPUNIT_ASSERT_EQUAL(DOWNLOAD_WAITING, hd->getStatus()); deleteDownloadHandle(hd); CPPUNIT_ASSERT_EQUAL(-1, removeDownload(session_, (A2Gid)0)); CPPUNIT_ASSERT_EQUAL(0, removeDownload(session_, gid)); hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT(!hd); } void Aria2ApiTest::testChangePosition() { int N = 10; std::vector gids(N); std::vector uris(1); KeyVals options; uris[0] = "http://localhost/"; for (int i = 0; i < N; ++i) { CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gids[i], uris, options)); } CPPUNIT_ASSERT_EQUAL(-1, changePosition(session_, (A2Gid)0, -2, OFFSET_MODE_CUR)); CPPUNIT_ASSERT_EQUAL(2, changePosition(session_, gids[4], -2, OFFSET_MODE_CUR)); CPPUNIT_ASSERT_EQUAL(5, changePosition(session_, gids[4], 5, OFFSET_MODE_SET)); CPPUNIT_ASSERT_EQUAL(7, changePosition(session_, gids[4], -2, OFFSET_MODE_END)); } void Aria2ApiTest::testChangeOption() { A2Gid gid; std::vector uris(1); KeyVals options; uris[0] = "http://localhost/1"; options.push_back(KeyVals::value_type("dir", "mydownload")); CPPUNIT_ASSERT_EQUAL(0, addUri(session_, &gid, uris, options)); DownloadHandle* hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT(hd); CPPUNIT_ASSERT_EQUAL(1, hd->getNumFiles()); FileData file = hd->getFile(1); CPPUNIT_ASSERT_EQUAL((size_t)1, file.uris.size()); CPPUNIT_ASSERT_EQUAL(uris[0], file.uris[0].uri); CPPUNIT_ASSERT_EQUAL(std::string("mydownload"), hd->getOption("dir")); CPPUNIT_ASSERT(hd->getOption("unknown").empty()); KeyVals retopts = hd->getOptions(); CPPUNIT_ASSERT(std::find(retopts.begin(), retopts.end(), KeyVals::value_type("dir", "mydownload")) != retopts.end()); // Don't return hidden option CPPUNIT_ASSERT(hd->getOption(PREF_STARTUP_IDLE_TIME->k).empty()); deleteDownloadHandle(hd); // failure with null gid CPPUNIT_ASSERT_EQUAL(-1, changeOption(session_, (A2Gid)0, options)); // change option options.clear(); options.push_back(KeyVals::value_type("dir", "newlocation")); CPPUNIT_ASSERT_EQUAL(0, changeOption(session_, gid, options)); hd = getDownloadHandle(session_, gid); CPPUNIT_ASSERT_EQUAL(std::string("newlocation"), hd->getOption("dir")); deleteDownloadHandle(hd); // failure with bad option value options.clear(); options.push_back(KeyVals::value_type("file-allocation", "foo")); CPPUNIT_ASSERT_EQUAL(-1, changeOption(session_, gid, options)); } void Aria2ApiTest::testChangeGlobalOption() { CPPUNIT_ASSERT_EQUAL(OptionParser::getInstance() ->find(PREF_FILE_ALLOCATION) ->getDefaultValue(), getGlobalOption(session_, PREF_FILE_ALLOCATION->k)); KeyVals options; options.push_back(KeyVals::value_type(PREF_FILE_ALLOCATION->k, "none")); CPPUNIT_ASSERT_EQUAL(0, changeGlobalOption(session_, options)); CPPUNIT_ASSERT_EQUAL(std::string("none"), getGlobalOption(session_, PREF_FILE_ALLOCATION->k)); // Don't return hidden option CPPUNIT_ASSERT(getGlobalOption(session_, PREF_STARTUP_IDLE_TIME->k).empty()); // failure with bad option value options.clear(); options.push_back(KeyVals::value_type(PREF_FILE_ALLOCATION->k, "foo")); CPPUNIT_ASSERT_EQUAL(-1, changeGlobalOption(session_, options)); } void Aria2ApiTest::testDownloadResultDH() { std::shared_ptr dr1 = createDownloadResult(error_code::TIME_OUT, "http://example.org/timeout"); dr1->option->put(PREF_DIR, "mydownload"); std::shared_ptr dr2 = createDownloadResult( error_code::NETWORK_PROBLEM, "http://example.org/network"); auto& gman = session_->context->reqinfo->getDownloadEngine()->getRequestGroupMan(); gman->addDownloadResult(dr1); gman->addDownloadResult(dr2); DownloadHandle* hd = getDownloadHandle(session_, dr1->gid->getNumericId()); CPPUNIT_ASSERT_EQUAL(DOWNLOAD_ERROR, hd->getStatus()); CPPUNIT_ASSERT_EQUAL((int)error_code::TIME_OUT, hd->getErrorCode()); CPPUNIT_ASSERT_EQUAL(std::string("mydownload"), hd->getOption(PREF_DIR->k)); // Don't return hidden option CPPUNIT_ASSERT(hd->getOption(PREF_STARTUP_IDLE_TIME->k).empty()); KeyVals retopts = hd->getOptions(); CPPUNIT_ASSERT(std::find(retopts.begin(), retopts.end(), KeyVals::value_type(PREF_DIR->k, "mydownload")) != retopts.end()); deleteDownloadHandle(hd); } } // namespace aria2 aria2-1.33.1/test/TimegmTest.cc0000644000175000017500000000257013200575774013104 00000000000000#include "timegm.h" #include #include #include namespace aria2 { class TimegmTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(TimegmTest); CPPUNIT_TEST(testTimegm); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} void tearDown() {} void testTimegm(); }; CPPUNIT_TEST_SUITE_REGISTRATION(TimegmTest); namespace { void setTime(struct tm* tm, int yr, int mon, int day, int h, int m, int s) { tm->tm_year = yr - 1900; tm->tm_mon = mon - 1; tm->tm_mday = day; tm->tm_hour = h; tm->tm_min = m; tm->tm_sec = s; } } // namespace void TimegmTest::testTimegm() { struct tm tm; memset(&tm, 0, sizeof(tm)); setTime(&tm, 1970, 1, 1, 0, 0, 0); CPPUNIT_ASSERT_EQUAL((time_t)0, timegm(&tm)); setTime(&tm, 2000, 1, 2, 1, 2, 3); CPPUNIT_ASSERT_EQUAL((time_t)946774923, timegm(&tm)); setTime(&tm, 2000, 2, 2, 1, 2, 3); CPPUNIT_ASSERT_EQUAL((time_t)949453323, timegm(&tm)); setTime(&tm, 2015, 10, 21, 10, 19, 30); CPPUNIT_ASSERT_EQUAL((time_t)1445422770, timegm(&tm)); setTime(&tm, 1970, 13, 1, 0, 0, 0); CPPUNIT_ASSERT_EQUAL((time_t)-1, timegm(&tm)); setTime(&tm, 2039, 1, 1, 0, 0, 0); if (sizeof(time_t) == 4) { CPPUNIT_ASSERT_EQUAL((time_t)-1, timegm(&tm)); } else if (sizeof(time_t) == 8) { CPPUNIT_ASSERT_EQUAL((time_t)2177452800LL, timegm(&tm)); } } } // namespace aria2 aria2-1.33.1/test/AsyncNameResolverTest.cc0000644000175000017500000000243613200575774015263 00000000000000#include "AsyncNameResolver.h" #include #include #include "SocketCore.h" namespace aria2 { class AsyncNameResolverTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(AsyncNameResolverTest); CPPUNIT_TEST(testParseAsyncDNSServers); CPPUNIT_TEST_SUITE_END(); public: void setUp() {} void tearDown() {} void testParseAsyncDNSServers(); }; CPPUNIT_TEST_SUITE_REGISTRATION(AsyncNameResolverTest); void AsyncNameResolverTest::testParseAsyncDNSServers() { #ifdef HAVE_ARES_ADDR_NODE in_addr ans4; CPPUNIT_ASSERT_EQUAL((size_t)4, net::getBinAddr(&ans4, "192.168.0.1")); in6_addr ans6; CPPUNIT_ASSERT_EQUAL((size_t)16, net::getBinAddr(&ans6, "2001:db8::2:1")); ares_addr_node* root; root = parseAsyncDNSServers("192.168.0.1,2001:db8::2:1"); ares_addr_node* node = root; CPPUNIT_ASSERT(node); CPPUNIT_ASSERT_EQUAL(AF_INET, node->family); CPPUNIT_ASSERT(memcmp(&ans4, &node->addr, sizeof(ans4)) == 0); node = node->next; CPPUNIT_ASSERT(node); CPPUNIT_ASSERT_EQUAL(AF_INET6, node->family); CPPUNIT_ASSERT(memcmp(&ans6, &node->addr, sizeof(ans6)) == 0); for (node = root; node;) { ares_addr_node* nextNode = node->next; delete node; node = nextNode; } #endif // HAVE_ARES_ADDR_NODE } } // namespace aria2 aria2-1.33.1/test/MetalinkProcessorTest.cc0000644000175000017500000010523313200575774015326 00000000000000#include "metalink_helper.h" #include #include #include "MetalinkParserStateMachine.h" #include "Exception.h" #include "DefaultDiskWriter.h" #include "ByteArrayDiskWriter.h" #include "Metalinker.h" #include "MetalinkEntry.h" #include "MetalinkResource.h" #include "MetalinkMetaurl.h" #include "MessageDigest.h" #include "ChunkChecksum.h" #include "Checksum.h" #include "Signature.h" #include "fmt.h" #include "RecoverableException.h" #include "util.h" namespace aria2 { class MetalinkProcessorTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(MetalinkProcessorTest); CPPUNIT_TEST(testParseFileV4); CPPUNIT_TEST(testParseFileV4_attrs); CPPUNIT_TEST(testParseFile); CPPUNIT_TEST(testParseFile_dirtraversal); CPPUNIT_TEST(testParseBinaryStream); CPPUNIT_TEST(testMalformedXML); CPPUNIT_TEST(testMalformedXML2); CPPUNIT_TEST(testBadSize); CPPUNIT_TEST(testBadSizeV4); CPPUNIT_TEST(testBadMaxConn); CPPUNIT_TEST(testNoName); CPPUNIT_TEST(testBadURLPrefs); CPPUNIT_TEST(testBadURLMaxConn); CPPUNIT_TEST(testUnsupportedType); CPPUNIT_TEST(testMultiplePieces); CPPUNIT_TEST(testBadPieceNo); CPPUNIT_TEST(testBadPieceLength); CPPUNIT_TEST(testUnsupportedType_piece); CPPUNIT_TEST(testLargeFileSize); CPPUNIT_TEST(testXmlPrefixV3); CPPUNIT_TEST_SUITE_END(); private: public: void testParseFileV4(); void testParseFileV4_attrs(); void testParseFile(); void testParseFile_dirtraversal(); void testParseBinaryStream(); void testMalformedXML(); void testMalformedXML2(); void testBadSize(); void testBadSizeV4(); void testBadMaxConn(); void testNoName(); void testBadURLPrefs(); void testBadURLMaxConn(); void testUnsupportedType(); void testMultiplePieces(); void testBadPieceNo(); void testBadPieceLength(); void testUnsupportedType_piece(); void testLargeFileSize(); void testXmlPrefixV3(); }; CPPUNIT_TEST_SUITE_REGISTRATION(MetalinkProcessorTest); void MetalinkProcessorTest::testParseFileV4() { auto m = metalink::parseFile(A2_TEST_DIR "/metalink4.xml"); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL(std::string("example.ext"), e->getPath()); CPPUNIT_ASSERT_EQUAL((int64_t)786430LL, e->getLength()); CPPUNIT_ASSERT_EQUAL(-1, e->maxConnections); CPPUNIT_ASSERT_EQUAL(std::string("0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"), util::toHex(e->checksum->getDigest())); CPPUNIT_ASSERT(e->checksum); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), e->checksum->getHashType()); CPPUNIT_ASSERT(e->chunkChecksum); if (MessageDigest::supports("sha-256")) { CPPUNIT_ASSERT_EQUAL(std::string("sha-256"), e->chunkChecksum->getHashType()); CPPUNIT_ASSERT_EQUAL(262144, e->chunkChecksum->getPieceLength()); CPPUNIT_ASSERT_EQUAL((size_t)3, e->chunkChecksum->countPieceHash()); CPPUNIT_ASSERT_EQUAL( std::string( "0245178074fd042e19b7c3885b360fc21064b30e73f5626c7e3b005d048069c5"), util::toHex(e->chunkChecksum->getPieceHash(0))); CPPUNIT_ASSERT_EQUAL( std::string( "487ba2299be7f759d7c7bf6a4ac3a32cee81f1bb9332fc485947e32918864fb2"), util::toHex(e->chunkChecksum->getPieceHash(1))); CPPUNIT_ASSERT_EQUAL( std::string( "37290d74ac4d186e3a8e5785d259d2ec04fac91ae28092e7620ec8bc99e830aa"), util::toHex(e->chunkChecksum->getPieceHash(2))); } else { CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), e->chunkChecksum->getHashType()); CPPUNIT_ASSERT_EQUAL(262144, e->chunkChecksum->getPieceLength()); CPPUNIT_ASSERT_EQUAL((size_t)3, e->chunkChecksum->countPieceHash()); CPPUNIT_ASSERT_EQUAL( std::string("5bd9f7248df0f3a6a86ab6c95f48787d546efa14"), util::toHex(e->chunkChecksum->getPieceHash(0))); CPPUNIT_ASSERT_EQUAL( std::string("9413ee70957a09d55704123687478e07f18c7b29"), util::toHex(e->chunkChecksum->getPieceHash(1))); CPPUNIT_ASSERT_EQUAL( std::string("44213f9f4d59b557314fadcd233232eebcac8012"), util::toHex(e->chunkChecksum->getPieceHash(2))); } CPPUNIT_ASSERT(e->getSignature()); CPPUNIT_ASSERT_EQUAL(std::string("application/pgp-signature"), e->getSignature()->getType()); CPPUNIT_ASSERT_EQUAL(std::string("a signature"), e->getSignature()->getBody()); CPPUNIT_ASSERT_EQUAL((size_t)2, e->resources.size()); auto& r = e->resources[0]; CPPUNIT_ASSERT_EQUAL(std::string("ftp://ftp.example.com/example.ext"), r->url); CPPUNIT_ASSERT_EQUAL(std::string("de"), r->location); CPPUNIT_ASSERT_EQUAL(1, r->priority); CPPUNIT_ASSERT_EQUAL(std::string("ftp"), MetalinkResource::getTypeString(r->type)); CPPUNIT_ASSERT_EQUAL(-1, r->maxConnections); #ifdef ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL((size_t)1, e->metaurls.size()); auto& mu = e->metaurls[0]; CPPUNIT_ASSERT_EQUAL(std::string("http://example.com/example.ext.torrent"), mu->url); CPPUNIT_ASSERT_EQUAL(2, mu->priority); CPPUNIT_ASSERT_EQUAL(std::string("torrent"), mu->mediatype); #else // !ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL((size_t)0, e->metaurls.size()); #endif // !ENABLE_BITTORRENT } void MetalinkProcessorTest::testParseFileV4_attrs() { std::unique_ptr m; ByteArrayDiskWriter dw; { // Testing file@name const char* tmpl = "" "" "" "http://example.org" "" ""; dw.setString(fmt(tmpl, "foo")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); // empty name dw.setString(fmt(tmpl, "")); try { metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } // dir traversing dw.setString(fmt(tmpl, "../doughnuts")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } } { // Testing url@priority const char* tmpl = "" "" "" "http://example.org" "" ""; dw.setString(fmt(tmpl, "0")); try { metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } dw.setString(fmt(tmpl, "1")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); dw.setString(fmt(tmpl, "100")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); dw.setString(fmt(tmpl, "999999")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); dw.setString(fmt(tmpl, "1000000")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } dw.setString(fmt(tmpl, "A")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } { // Testing metaurl@priority const char* tmpl = "" "" "" "http://example.org" "" ""; dw.setString(fmt(tmpl, "0")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } dw.setString(fmt(tmpl, "1")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); dw.setString(fmt(tmpl, "100")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); dw.setString(fmt(tmpl, "999999")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); dw.setString(fmt(tmpl, "1000000")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } dw.setString(fmt(tmpl, "A")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } { // Testing metaurl@mediatype // no mediatype dw.setString("" "" "" "http://example.org" "" ""); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } const char* tmpl = "" "" "" "http://example.org" "" ""; dw.setString(fmt(tmpl, "torrent")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); // empty mediatype dw.setString(fmt(tmpl, "")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } } { // Testing metaurl@name const char* tmpl = "" "" "" "http://example.org" "" ""; dw.setString(fmt(tmpl, "foo")); m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); // dir traversing dw.setString(fmt(tmpl, "../doughnuts")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } // empty name dw.setString(fmt(tmpl, "")); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { // success } } { // Testing pieces@length // No pieces@length dw.setString("" "" "" "http://example.org" "" "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" "" "" ""); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } const char* tmpl = "" "" "" "http://example.org" "" "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" "" "" ""; dw.setString(fmt(tmpl, "262144")); m = metalink::parseBinaryStream(&dw); // empty try { dw.setString(fmt(tmpl, "")); m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } // not a number try { dw.setString(fmt(tmpl, "A")); m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } { // Testing pieces@type // No pieces@type dw.setString("" "" "" "http://example.org" "" "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" "" "" ""); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } const char* tmpl = "" "" "" "http://example.org" "" "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" "" "" ""; dw.setString(fmt(tmpl, "sha-1")); m = metalink::parseBinaryStream(&dw); // empty try { dw.setString(fmt(tmpl, "")); m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } { // Testing hash@type // No hash@type dw.setString("" "" "" "http://example.org" "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" "" ""); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } const char* tmpl = "" "" "" "http://example.org" "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33" "" ""; dw.setString(fmt(tmpl, "sha-1")); m = metalink::parseBinaryStream(&dw); // empty try { dw.setString(fmt(tmpl, "")); m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } { // Testing signature@mediatype // No hash@type dw.setString("" "" "" "http://example.org" "sig" "" ""); try { m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } const char* tmpl = "" "" "" "http://example.org" "sig" "" ""; dw.setString(fmt(tmpl, "application/pgp-signature")); m = metalink::parseBinaryStream(&dw); // empty try { dw.setString(fmt(tmpl, "")); m = metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } } void MetalinkProcessorTest::testParseFile() { try { auto metalinker = metalink::parseFile(A2_TEST_DIR "/test.xml"); auto entryItr = std::begin(metalinker->getEntries()); auto& entry1 = *entryItr; CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), entry1->getPath()); CPPUNIT_ASSERT_EQUAL((int64_t)0LL, entry1->getLength()); CPPUNIT_ASSERT_EQUAL(std::string("0.5.2"), entry1->version); CPPUNIT_ASSERT_EQUAL(std::string("en-US"), entry1->languages[0]); CPPUNIT_ASSERT_EQUAL(std::string("Linux-x86"), entry1->oses[0]); CPPUNIT_ASSERT_EQUAL(1, entry1->maxConnections); CPPUNIT_ASSERT_EQUAL( std::string("a96cf3f0266b91d87d5124cf94326422800b627d"), util::toHex(entry1->checksum->getDigest())); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), entry1->checksum->getHashType()); CPPUNIT_ASSERT(entry1->getSignature()); CPPUNIT_ASSERT_EQUAL(std::string("pgp"), entry1->getSignature()->getType()); CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2.sig"), entry1->getSignature()->getFile()); // Note that we don't strip anything CPPUNIT_ASSERT_EQUAL( std::string( "\n-----BEGIN PGP SIGNATURE-----\n" "Version: GnuPG v1.4.9 (GNU/Linux)\n" "\n" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n" "ffffffffffffffffffffffff\n" "fffff\n" "-----END PGP SIGNATURE-----\n" "\t"), entry1->getSignature()->getBody()); auto resourceItr1 = std::begin(entry1->resources); auto& resource1 = *resourceItr1; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, resource1->type); CPPUNIT_ASSERT_EQUAL(std::string("jp"), resource1->location); CPPUNIT_ASSERT_EQUAL(1, resource1->priority); CPPUNIT_ASSERT_EQUAL(std::string("ftp://ftphost/aria2-0.5.2.tar.bz2"), resource1->url); CPPUNIT_ASSERT_EQUAL(1, resource1->maxConnections); ++resourceItr1; auto& resource2 = *resourceItr1; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_HTTP, resource2->type); CPPUNIT_ASSERT_EQUAL(std::string("us"), resource2->location); CPPUNIT_ASSERT_EQUAL(1, resource2->priority); CPPUNIT_ASSERT_EQUAL(std::string("http://httphost/aria2-0.5.2.tar.bz2"), resource2->url); CPPUNIT_ASSERT_EQUAL(-1, resource2->maxConnections); ++entryItr; auto& entry2 = *entryItr; CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.1.tar.bz2"), entry2->getPath()); CPPUNIT_ASSERT_EQUAL((int64_t)345689LL, entry2->getLength()); CPPUNIT_ASSERT_EQUAL(std::string("0.5.1"), entry2->version); CPPUNIT_ASSERT_EQUAL(std::string("ja-JP"), entry2->languages[0]); CPPUNIT_ASSERT_EQUAL(std::string("Linux-m68k"), entry2->oses[0]); CPPUNIT_ASSERT_EQUAL(-1, entry2->maxConnections); CPPUNIT_ASSERT_EQUAL( std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"), util::toHex(entry2->checksum->getDigest())); CPPUNIT_ASSERT_EQUAL((size_t)2, entry2->chunkChecksum->countPieceHash()); CPPUNIT_ASSERT_EQUAL(262144, entry2->chunkChecksum->getPieceLength()); CPPUNIT_ASSERT_EQUAL( std::string("179463a88d79cbf0b1923991708aead914f26142"), util::toHex(entry2->chunkChecksum->getPieceHash(0))); CPPUNIT_ASSERT_EQUAL( std::string("fecf8bc9a1647505fe16746f94e97a477597dbf3"), util::toHex(entry2->chunkChecksum->getPieceHash(1))); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), entry2->checksum->getHashType()); // See that signature is null CPPUNIT_ASSERT(!entry2->getSignature()); ++entryItr; // test case: verification hash is not provided auto& entry3 = *entryItr; CPPUNIT_ASSERT_EQUAL(std::string("NoVerificationHash"), entry3->getPath()); CPPUNIT_ASSERT(!entry3->checksum); CPPUNIT_ASSERT(!entry3->chunkChecksum); ++entryItr; // test case: unsupported verification hash is included auto& entry4 = *entryItr; CPPUNIT_ASSERT_EQUAL(std::string("UnsupportedVerificationHashTypeIncluded"), entry4->getPath()); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), entry4->checksum->getHashType()); CPPUNIT_ASSERT_EQUAL( std::string("4c255b0ed130f5ea880f0aa061c3da0487e251cc"), util::toHex(entry4->checksum->getDigest())); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), entry4->chunkChecksum->getHashType()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testParseFile_dirtraversal() { auto metalinker = metalink::parseFile(A2_TEST_DIR "/metalink3-dirtraversal.xml"); CPPUNIT_ASSERT_EQUAL((size_t)1, metalinker->getEntries().size()); auto& e = metalinker->getEntries()[0]; CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.3.tar.bz2"), e->getPath()); CPPUNIT_ASSERT(e->getSignature()); CPPUNIT_ASSERT_EQUAL(std::string(""), e->getSignature()->getFile()); } void MetalinkProcessorTest::testParseBinaryStream() { DefaultDiskWriter dw(A2_TEST_DIR "/test.xml"); dw.enableReadOnly(); dw.openExistingFile(); try { auto m = metalink::parseBinaryStream(&dw); auto& entry1 = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), entry1->getPath()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testMalformedXML() { ByteArrayDiskWriter dw; dw.setString(""); try { metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (Exception& e) { std::cerr << e.stackTrace() << std::endl; } } void MetalinkProcessorTest::testMalformedXML2() { ByteArrayDiskWriter dw; dw.setString(""); try { metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (Exception& e) { std::cerr << e.stackTrace() << std::endl; } } void MetalinkProcessorTest::testBadSizeV4() { ByteArrayDiskWriter dw; const char* tmpl = "" "" "" "%s" "http://example.org" "" ""; dw.setString(fmt(tmpl, "9223372036854775807")); metalink::parseBinaryStream(&dw); dw.setString(fmt(tmpl, "-1")); try { metalink::parseBinaryStream(&dw); CPPUNIT_FAIL("exception must be thrown."); } catch (RecoverableException& e) { } } void MetalinkProcessorTest::testBadSize() { ByteArrayDiskWriter dw; dw.setString("" "" "" " abc" " 0.5.2" " en-US" " Linux-x86" "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), e->getPath()); CPPUNIT_ASSERT_EQUAL((int64_t)0LL, e->getLength()); CPPUNIT_ASSERT_EQUAL(std::string("0.5.2"), e->version); CPPUNIT_ASSERT_EQUAL(std::string("en-US"), e->languages[0]); CPPUNIT_ASSERT_EQUAL(std::string("Linux-x86"), e->oses[0]); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testBadMaxConn() { ByteArrayDiskWriter dw; dw.setString("" "" "" " 43743838" " 0.5.2" " en-US" " Linux-x86" " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL((int64_t)43743838LL, e->getLength()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testNoName() { ByteArrayDiskWriter dw; dw.setString("" "" "" " 1024" " 0.0.1" " GB" " Linux-x64" "" "" " 43743838" " 0.5.2" " en-US" " Linux-x86" "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.2.tar.bz2"), e->getPath()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testBadURLPrefs() { ByteArrayDiskWriter dw; dw.setString("" "" "" " 43743838" " 0.5.2" " en-US" " Linux-x86" " " " ftp://mirror/" " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; auto& r = e->resources[0]; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, r->type); CPPUNIT_ASSERT_EQUAL(MetalinkResource::getLowestPriority(), r->priority); CPPUNIT_ASSERT_EQUAL(1, r->maxConnections); CPPUNIT_ASSERT_EQUAL(std::string("jp"), r->location); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testBadURLMaxConn() { ByteArrayDiskWriter dw; dw.setString("" "" "" " 43743838" " 0.5.2" " en-US" " Linux-x86" " " " ftp://mirror/" " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; auto& r = e->resources[0]; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, r->type); CPPUNIT_ASSERT_EQUAL(1, r->priority); CPPUNIT_ASSERT_EQUAL(-1, r->maxConnections); CPPUNIT_ASSERT_EQUAL(std::string("jp"), r->location); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testUnsupportedType() { ByteArrayDiskWriter dw; dw.setString("" "" "" " 43743838" " 0.5.2" " en-US" " Linux-x86" " " " ftp://mirror/" " magnet:xt=XYZ" " http://mirror/" " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL((size_t)3, e->resources.size()); auto& r1 = e->resources[0]; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_FTP, r1->type); auto& r2 = e->resources[1]; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_NOT_SUPPORTED, r2->type); auto& r3 = e->resources[2]; CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_HTTP, r3->type); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testMultiplePieces() { ByteArrayDiskWriter dw; dw.setString("" "" "" " " " " " " " " " " " " "" "" ""); try { // aria2 prefers sha1 auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; auto& c = e->chunkChecksum; CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), c->getHashType()); CPPUNIT_ASSERT_EQUAL((int32_t)1_k, c->getPieceLength()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testBadPieceNo() { ByteArrayDiskWriter dw; dw.setString( "" "" "" " " " " " 44213f9f4d59b557314fadcd233232eebcac8012" " 44213f9f4d59b557314fadcd233232eebcac8012" " " " " " 44213f9f4d59b557314fadcd233232eebcac8012" " " " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; auto& c = e->chunkChecksum; CPPUNIT_ASSERT(c); CPPUNIT_ASSERT_EQUAL((int32_t)1_k, c->getPieceLength()); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), c->getHashType()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testBadPieceLength() { ByteArrayDiskWriter dw; dw.setString( "" "" "" " " " " " 44213f9f4d59b557314fadcd233232eebcac8012" " " " " " 44213f9f4d59b557314fadcd233232eebcac8012" " " " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); auto& e = m->getEntries()[0]; auto& c = e->chunkChecksum; CPPUNIT_ASSERT(c); CPPUNIT_ASSERT_EQUAL((int32_t)1_k, c->getPieceLength()); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), c->getHashType()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testUnsupportedType_piece() { ByteArrayDiskWriter dw; dw.setString( "" "" "" " " " " " 44213f9f4d59b557314fadcd233232eebcac8012" " " " " " 44213f9f4d59b557314fadcd233232eebcac8012" " " " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; auto& c = e->chunkChecksum; CPPUNIT_ASSERT(c); CPPUNIT_ASSERT_EQUAL((int32_t)1_k, c->getPieceLength()); CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), c->getHashType()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testLargeFileSize() { ByteArrayDiskWriter dw; dw.setString("" "" "" " 9223372036854775807" " " " ftp://mirror/" " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775807LL, e->getLength()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } void MetalinkProcessorTest::testXmlPrefixV3() { ByteArrayDiskWriter dw; dw.setString( "" "" "" " 9223372036854775807" " " " ftp://mirror/" " " "" "" ""); try { auto m = metalink::parseBinaryStream(&dw); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL((int64_t)9223372036854775807LL, e->getLength()); } catch (Exception& e) { CPPUNIT_FAIL(e.stackTrace()); } } } // namespace aria2 aria2-1.33.1/test/MetalinkParserControllerTest.cc0000644000175000017500000002765713200575774016664 00000000000000#include "MetalinkParserController.h" #include #include "Metalinker.h" #include "MetalinkEntry.h" #include "MetalinkResource.h" #include "MetalinkMetaurl.h" #include "FileEntry.h" #include "Checksum.h" #include "ChunkChecksum.h" #include "Signature.h" namespace aria2 { class MetalinkParserControllerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(MetalinkParserControllerTest); CPPUNIT_TEST(testEntryTransaction); CPPUNIT_TEST(testResourceTransaction); CPPUNIT_TEST(testResourceTransaction_withBaseUri); CPPUNIT_TEST(testMetaurlTransaction); CPPUNIT_TEST(testChecksumTransaction); CPPUNIT_TEST(testChunkChecksumTransaction); CPPUNIT_TEST(testChunkChecksumTransactionV4); CPPUNIT_TEST(testSignatureTransaction); CPPUNIT_TEST_SUITE_END(); private: public: void setUp() {} void tearDown() {} void testEntryTransaction(); void testResourceTransaction(); void testResourceTransaction_withBaseUri(); void testMetaurlTransaction(); void testChecksumTransaction(); void testChunkChecksumTransaction(); void testChunkChecksumTransactionV4(); void testSignatureTransaction(); }; CPPUNIT_TEST_SUITE_REGISTRATION(MetalinkParserControllerTest); void MetalinkParserControllerTest::testEntryTransaction() { MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.setFileNameOfEntry("aria2.tar.bz2"); ctrl.setFileLengthOfEntry(1_m); ctrl.setVersionOfEntry("1.0"); ctrl.setLanguageOfEntry("ja_JP"); ctrl.setOSOfEntry("Linux"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.cancelEntryTransaction(); { auto m = ctrl.getResult(); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); auto& e = m->getEntries()[0]; CPPUNIT_ASSERT_EQUAL(std::string("aria2.tar.bz2"), e->file->getPath()); CPPUNIT_ASSERT_EQUAL((int64_t)1_m, e->file->getLength()); CPPUNIT_ASSERT_EQUAL((int64_t)0, e->file->getOffset()); CPPUNIT_ASSERT_EQUAL(std::string("1.0"), e->version); CPPUNIT_ASSERT_EQUAL(std::string("ja_JP"), e->languages[0]); CPPUNIT_ASSERT_EQUAL(std::string("Linux"), e->oses[0]); } } void MetalinkParserControllerTest::testResourceTransaction() { MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.newResourceTransaction(); ctrl.setURLOfResource("http://mirror/aria2.tar.bz2"); ctrl.setTypeOfResource("http"); ctrl.setLocationOfResource("US"); ctrl.setPriorityOfResource(100); ctrl.setMaxConnectionsOfResource(1); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newResourceTransaction(); ctrl.cancelResourceTransaction(); ctrl.commitEntryTransaction(); { auto m = ctrl.getResult(); CPPUNIT_ASSERT_EQUAL((size_t)2, m->getEntries().size()); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries()[0]->resources.size()); CPPUNIT_ASSERT_EQUAL((size_t)0, m->getEntries()[1]->resources.size()); auto& res = m->getEntries()[0]->resources[0]; CPPUNIT_ASSERT_EQUAL(std::string("http://mirror/aria2.tar.bz2"), res->url); CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_HTTP, res->type); CPPUNIT_ASSERT_EQUAL(std::string("US"), res->location); CPPUNIT_ASSERT_EQUAL(100, res->priority); CPPUNIT_ASSERT_EQUAL(1, res->maxConnections); } } void MetalinkParserControllerTest::testResourceTransaction_withBaseUri() { MetalinkParserController ctrl; ctrl.setBaseUri("http://base/dir/file"); ctrl.newEntryTransaction(); ctrl.newResourceTransaction(); ctrl.setURLOfResource("aria2.tar.bz2"); ctrl.commitResourceTransaction(); #ifdef ENABLE_BITTORRENT ctrl.newMetaurlTransaction(); ctrl.setURLOfMetaurl("/meta/aria2.tar.bz2.torrent"); ctrl.setMediatypeOfMetaurl("torrent"); ctrl.commitMetaurlTransaction(); ctrl.newMetaurlTransaction(); ctrl.setURLOfMetaurl( "magnet:?xt=urn:btih:248d0a1cd08284299de78d5c1ed359bb46717d8c"); ctrl.setMediatypeOfMetaurl("torrent"); ctrl.commitMetaurlTransaction(); #endif // ENABLE_BITTORRENT ctrl.commitEntryTransaction(); { auto m = ctrl.getResult(); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries()[0]->resources.size()); auto& res = m->getEntries()[0]->resources[0]; CPPUNIT_ASSERT_EQUAL(std::string("http://base/dir/aria2.tar.bz2"), res->url); CPPUNIT_ASSERT_EQUAL(MetalinkResource::TYPE_HTTP, res->type); #ifdef ENABLE_BITTORRENT CPPUNIT_ASSERT_EQUAL((size_t)2, m->getEntries()[0]->metaurls.size()); CPPUNIT_ASSERT_EQUAL(std::string("http://base/meta/aria2.tar.bz2.torrent"), m->getEntries()[0]->metaurls[0]->url); CPPUNIT_ASSERT_EQUAL( std::string( "magnet:?xt=urn:btih:248d0a1cd08284299de78d5c1ed359bb46717d8c"), m->getEntries()[0]->metaurls[1]->url); #endif // ENABLE_BITTORRENT } } void MetalinkParserControllerTest::testMetaurlTransaction() { MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.newMetaurlTransaction(); ctrl.setURLOfMetaurl("http://example.org/chocolate.torrent"); ctrl.setMediatypeOfMetaurl("torrent"); ctrl.setPriorityOfMetaurl(999); ctrl.setNameOfMetaurl("mybirthdaycake"); ctrl.commitEntryTransaction(); #ifdef ENABLE_BITTORRENT ctrl.newEntryTransaction(); ctrl.newMetaurlTransaction(); ctrl.cancelMetaurlTransaction(); ctrl.commitEntryTransaction(); { auto m = ctrl.getResult(); CPPUNIT_ASSERT_EQUAL((size_t)2, m->getEntries().size()); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries()[0]->metaurls.size()); CPPUNIT_ASSERT_EQUAL((size_t)0, m->getEntries()[1]->metaurls.size()); auto& metaurl = m->getEntries()[0]->metaurls[0]; CPPUNIT_ASSERT_EQUAL(std::string("http://example.org/chocolate.torrent"), metaurl->url); CPPUNIT_ASSERT_EQUAL(std::string("torrent"), metaurl->mediatype); CPPUNIT_ASSERT_EQUAL(std::string("mybirthdaycake"), metaurl->name); CPPUNIT_ASSERT_EQUAL(999, metaurl->priority); } #else // !ENABLE_BITTORRENT { auto m = ctrl.getResult(); CPPUNIT_ASSERT_EQUAL((size_t)1, m->getEntries().size()); CPPUNIT_ASSERT_EQUAL((size_t)0, m->getEntries()[0]->metaurls.size()); } #endif // !ENABLE_BITTORRENT } void MetalinkParserControllerTest::testChecksumTransaction() { MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.newChecksumTransaction(); ctrl.setTypeOfChecksum("md5"); ctrl.setHashOfChecksum("acbd18db4cc2f85cedef654fccc4a4d8"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newChecksumTransaction(); ctrl.setTypeOfChecksum("md5"); ctrl.setHashOfChecksum("badhash"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newChecksumTransaction(); ctrl.cancelChecksumTransaction(); ctrl.commitEntryTransaction(); { auto m = ctrl.getResult(); auto& md = m->getEntries()[0]->checksum; CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getHashType()); CPPUNIT_ASSERT_EQUAL(std::string("acbd18db4cc2f85cedef654fccc4a4d8"), util::toHex(md->getDigest())); CPPUNIT_ASSERT(!m->getEntries()[1]->checksum); CPPUNIT_ASSERT(!m->getEntries()[2]->checksum); } } void MetalinkParserControllerTest::testChunkChecksumTransaction() { MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.newChunkChecksumTransaction(); ctrl.setTypeOfChunkChecksum("md5"); ctrl.setLengthOfChunkChecksum(256_k); ctrl.addHashOfChunkChecksum(4, "4cbd18db4cc2f85cedef654fccc4a4d8"); ctrl.addHashOfChunkChecksum(1, "1cbd18db4cc2f85cedef654fccc4a4d8"); ctrl.addHashOfChunkChecksum(3, "3cbd18db4cc2f85cedef654fccc4a4d8"); ctrl.addHashOfChunkChecksum(2, "2cbd18db4cc2f85cedef654fccc4a4d8"); ctrl.addHashOfChunkChecksum(5, "5cbd18db4cc2f85cedef654fccc4a4d8"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newChunkChecksumTransaction(); ctrl.setTypeOfChunkChecksum("md5"); ctrl.setLengthOfChunkChecksum(256_k); ctrl.addHashOfChunkChecksum(1, "badhash"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newChunkChecksumTransaction(); ctrl.cancelChunkChecksumTransaction(); ctrl.commitEntryTransaction(); { auto m = ctrl.getResult(); auto& md = m->getEntries()[0]->chunkChecksum; CPPUNIT_ASSERT_EQUAL(std::string("md5"), md->getHashType()); CPPUNIT_ASSERT_EQUAL((int32_t)256_k, md->getPieceLength()); CPPUNIT_ASSERT_EQUAL((size_t)5, md->countPieceHash()); CPPUNIT_ASSERT_EQUAL(std::string("1cbd18db4cc2f85cedef654fccc4a4d8"), md->getPieceHashes()[0]); CPPUNIT_ASSERT_EQUAL(std::string("2cbd18db4cc2f85cedef654fccc4a4d8"), md->getPieceHashes()[1]); CPPUNIT_ASSERT_EQUAL(std::string("3cbd18db4cc2f85cedef654fccc4a4d8"), md->getPieceHashes()[2]); CPPUNIT_ASSERT_EQUAL(std::string("4cbd18db4cc2f85cedef654fccc4a4d8"), md->getPieceHashes()[3]); CPPUNIT_ASSERT_EQUAL(std::string("5cbd18db4cc2f85cedef654fccc4a4d8"), md->getPieceHashes()[4]); CPPUNIT_ASSERT(!m->getEntries()[1]->chunkChecksum); CPPUNIT_ASSERT(!m->getEntries()[2]->chunkChecksum); } } void MetalinkParserControllerTest::testChunkChecksumTransactionV4() { MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.newChunkChecksumTransactionV4(); ctrl.setTypeOfChunkChecksumV4("sha-1"); ctrl.setLengthOfChunkChecksumV4(256_k); ctrl.addHashOfChunkChecksumV4("5bd9f7248df0f3a6a86ab6c95f48787d546efa14"); ctrl.addHashOfChunkChecksumV4("9413ee70957a09d55704123687478e07f18c7b29"); ctrl.addHashOfChunkChecksumV4("44213f9f4d59b557314fadcd233232eebcac8012"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newChunkChecksumTransactionV4(); ctrl.setTypeOfChunkChecksumV4("sha-1"); ctrl.setLengthOfChunkChecksumV4(256_k); ctrl.addHashOfChunkChecksumV4("5bd9f7248df0f3a6a86ab6c95f48787d546efa14"); ctrl.addHashOfChunkChecksumV4("badhash"); ctrl.commitEntryTransaction(); ctrl.newEntryTransaction(); ctrl.newChunkChecksumTransactionV4(); ctrl.cancelChunkChecksumTransactionV4(); ctrl.commitEntryTransaction(); { auto m = ctrl.getResult(); auto& md = m->getEntries()[0]->chunkChecksum; CPPUNIT_ASSERT_EQUAL(std::string("sha-1"), md->getHashType()); CPPUNIT_ASSERT_EQUAL((int32_t)256_k, md->getPieceLength()); CPPUNIT_ASSERT_EQUAL((size_t)3, md->countPieceHash()); CPPUNIT_ASSERT_EQUAL( std::string("5bd9f7248df0f3a6a86ab6c95f48787d546efa14"), util::toHex(md->getPieceHashes()[0])); CPPUNIT_ASSERT_EQUAL( std::string("9413ee70957a09d55704123687478e07f18c7b29"), util::toHex(md->getPieceHashes()[1])); CPPUNIT_ASSERT_EQUAL( std::string("44213f9f4d59b557314fadcd233232eebcac8012"), util::toHex(md->getPieceHashes()[2])); CPPUNIT_ASSERT(!m->getEntries()[1]->chunkChecksum); CPPUNIT_ASSERT(!m->getEntries()[2]->chunkChecksum); } } void MetalinkParserControllerTest::testSignatureTransaction() { static std::string pgpSignature = "-----BEGIN PGP SIGNATURE-----\n" "Version: GnuPG v1.4.9 (GNU/Linux)\n" "\n" "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\n" "ffffffffffffffffffffffff\n" "fffff\n" "-----END PGP SIGNATURE-----\n"; MetalinkParserController ctrl; ctrl.newEntryTransaction(); ctrl.newSignatureTransaction(); ctrl.setTypeOfSignature("pgp"); ctrl.setFileOfSignature("aria2.sig"); ctrl.setBodyOfSignature(pgpSignature); // commitEntryTransaction also commits signature transaction. ctrl.commitEntryTransaction(); // See when signature transaction is canceled: ctrl.newEntryTransaction(); ctrl.newSignatureTransaction(); ctrl.cancelSignatureTransaction(); ctrl.commitEntryTransaction(); auto m = ctrl.getResult(); CPPUNIT_ASSERT_EQUAL((size_t)2, m->getEntries().size()); auto& sig = m->getEntries()[0]->getSignature(); CPPUNIT_ASSERT_EQUAL(std::string("pgp"), sig->getType()); CPPUNIT_ASSERT_EQUAL(std::string("aria2.sig"), sig->getFile()); CPPUNIT_ASSERT_EQUAL(pgpSignature, sig->getBody()); CPPUNIT_ASSERT(!m->getEntries()[1]->getSignature()); } } // namespace aria2 aria2-1.33.1/test/MetalinkHelperTest.cc0000644000175000017500000000627413200575774014573 00000000000000#include "metalink_helper.h" #include #include "MetalinkEntry.h" #include "Option.h" #include "prefs.h" #include "MetalinkMetaurl.h" #include "a2functional.h" namespace aria2 { class MetalinkHelperTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(MetalinkHelperTest); CPPUNIT_TEST(testParseAndQuery); CPPUNIT_TEST(testParseAndQuery_version); CPPUNIT_TEST(testGroupEntryByMetaurlName); CPPUNIT_TEST_SUITE_END(); private: public: void testParseAndQuery(); void testParseAndQuery_version(); void testGroupEntryByMetaurlName(); }; CPPUNIT_TEST_SUITE_REGISTRATION(MetalinkHelperTest); void MetalinkHelperTest::testParseAndQuery() { Option option; auto result = metalink::parseAndQuery(A2_TEST_DIR "/test.xml", &option); CPPUNIT_ASSERT_EQUAL((size_t)5, result.size()); } void MetalinkHelperTest::testParseAndQuery_version() { Option option; option.put(PREF_METALINK_VERSION, "0.5.1"); auto result = metalink::parseAndQuery(A2_TEST_DIR "/test.xml", &option); CPPUNIT_ASSERT_EQUAL((size_t)1, result.size()); auto& entry = result.front(); CPPUNIT_ASSERT_EQUAL(std::string("aria2-0.5.1.tar.bz2"), entry->getPath()); } void MetalinkHelperTest::testGroupEntryByMetaurlName() { std::vector> entries; auto e1 = make_unique(); e1->version = "1"; e1->sizeKnown = true; // no name e1->metaurls.push_back( make_unique("http://meta1", "torrent", "", 1)); auto e2 = make_unique(); e2->version = "2"; e2->sizeKnown = true; auto e3 = make_unique(); e3->version = "3"; e3->sizeKnown = true; e3->metaurls.push_back( make_unique("http://meta2", "torrent", "f3", 1)); auto e4 = make_unique(); e4->version = "4"; e4->sizeKnown = true; e4->metaurls.push_back( make_unique("http://meta1", "torrent", "f4", 1)); auto e5 = make_unique(); e5->version = "5"; // no size e5->metaurls.push_back( make_unique("http://meta1", "torrent", "f5", 1)); auto e6 = make_unique(); e6->version = "6"; e6->sizeKnown = true; e6->metaurls.push_back( make_unique("http://meta1", "torrent", "f6", 1)); entries.push_back(std::move(e1)); entries.push_back(std::move(e2)); entries.push_back(std::move(e3)); entries.push_back(std::move(e4)); entries.push_back(std::move(e5)); entries.push_back(std::move(e6)); auto result = metalink::groupEntryByMetaurlName(entries); CPPUNIT_ASSERT_EQUAL(std::string("http://meta1"), result[0].first); CPPUNIT_ASSERT_EQUAL(std::string("1"), result[0].second[0]->version); CPPUNIT_ASSERT_EQUAL(std::string(""), result[1].first); CPPUNIT_ASSERT_EQUAL(std::string("2"), result[1].second[0]->version); CPPUNIT_ASSERT_EQUAL(std::string("http://meta2"), result[2].first); CPPUNIT_ASSERT_EQUAL(std::string("3"), result[2].second[0]->version); CPPUNIT_ASSERT_EQUAL(std::string("http://meta1"), result[3].first); CPPUNIT_ASSERT_EQUAL(std::string("4"), result[3].second[0]->version); CPPUNIT_ASSERT_EQUAL(std::string("6"), result[3].second[1]->version); } } // namespace aria2 aria2-1.33.1/test/MetalinkPostDownloadHandlerTest.cc0000644000175000017500000000671413200575774017266 00000000000000#include "MetalinkPostDownloadHandler.h" #include #include "RequestGroup.h" #include "Option.h" #include "DownloadContext.h" #include "FileEntry.h" #include "PieceStorage.h" #include "DiskAdaptor.h" #include "RequestGroupCriteria.h" namespace aria2 { class MetalinkPostDownloadHandlerTest : public CppUnit::TestFixture { CPPUNIT_TEST_SUITE(MetalinkPostDownloadHandlerTest); CPPUNIT_TEST(testCanHandle_extension); CPPUNIT_TEST(testCanHandle_contentType); CPPUNIT_TEST(testGetNextRequestGroups); CPPUNIT_TEST(testGetNextRequestGroups_withBaseUri); CPPUNIT_TEST_SUITE_END(); private: std::shared_ptr