From ca554c9e30490877e9fcdce838bd663873d1f4f8 Mon Sep 17 00:00:00 2001 From: RayPlante Date: Sun, 7 Jul 2024 16:12:16 -0400 Subject: [PATCH] Ensure support for UTF-8 chars in filenames; update tests and test data to test support. --- python/nistoar/pdr/preserv/bagger/midas3.py | 4 +-- python/nistoar/pdr/preserv/bagit/builder.py | 8 +++--- python/nistoar/pdr/publish/midas3/mdwsgi.py | 24 ++++++++++++++---- .../pdr/distrib/data/1491.1_0.mbag0_4-0.zip | Bin 15806 -> 17526 bytes .../nistoar/pdr/preserv/bagger/test_midas.py | 14 +++++----- .../nistoar/pdr/preserv/bagger/test_midas3.py | 16 ++++++------ .../3A1EE2F169DD3B8CE0531A570681DB5D1491.json | 24 +++++++++++++++++- .../data/midassip/review/1491/_pod.json | 6 +++++ .../review/1491/trial3/trial3\316\261.json" | 5 ++++ .../service/test_siphandler_restricted.py | 4 +-- .../nistoar/pdr/publish/midas3/test_mdwsgi.py | 22 +++++++++++++++- python/tests/nistoar/pdr/test_utils.py | 11 ++++++++ 12 files changed, 108 insertions(+), 30 deletions(-) create mode 100644 "python/tests/nistoar/pdr/preserv/data/midassip/review/1491/trial3/trial3\316\261.json" diff --git a/python/nistoar/pdr/preserv/bagger/midas3.py b/python/nistoar/pdr/preserv/bagger/midas3.py index 023529efd..65d66188c 100644 --- a/python/nistoar/pdr/preserv/bagger/midas3.py +++ b/python/nistoar/pdr/preserv/bagger/midas3.py @@ -28,7 +28,7 @@ from ....nerdm import utils as nerdutils from ... import def_merge_etcdir, utils, ARK_NAAN, PDR_PUBLIC_SERVER from .. import (SIPDirectoryError, SIPDirectoryNotFound, AIPValidationError, - ConfigurationException, StateException, PODError, + ConfigurationException, StateException, PODError, NERDError, PreservationStateError) from .... import pdr from .prepupd import UpdatePrepService @@ -324,7 +324,7 @@ def _filepaths_in_pod(self): pod = self._pod_rec() - return [self._distsvcurl.sub('', urllib.unquote(d['downloadURL'])) + return [self._distsvcurl.sub('', urllib.unquote(str(d['downloadURL']))) for d in pod.get('distribution',[]) if 'downloadURL' in d] diff --git a/python/nistoar/pdr/preserv/bagit/builder.py b/python/nistoar/pdr/preserv/bagit/builder.py index 078b99366..ea57d60d4 100644 --- a/python/nistoar/pdr/preserv/bagit/builder.py +++ b/python/nistoar/pdr/preserv/bagit/builder.py @@ -445,7 +445,7 @@ def _download_url(self, ediid, destpath): if ediid.startswith(arkpfx): # our convention is to omit the "ark:/88434/" prefix ediid = ediid[len(arkpfx):] - return self._distbase + ediid + '/' + urlencode(path) + return self._distbase + ediid + '/' + urlencode(str(path)) def assign_id(self, id, keep_conv=False): """ @@ -2495,7 +2495,7 @@ def _create_def_datafile_md(self, destpath): out = OrderedDict([ ("_schema", NERD_DEF + "Component"), ("@context", NERDM_CONTEXT), - ("@id", "cmps/" + urlencode(destpath)), + ("@id", "cmps/" + urlencode(str(destpath))), ("@type", deepcopy(self._comp_types["DataFile"][0])) ]) out["_extensionSchemas"] = deepcopy(self._comp_types["DataFile"][1]) @@ -2514,7 +2514,7 @@ def _create_def_chksum_md(self, destpath): out = OrderedDict([ ("_schema", NERD_DEF + "Component"), ("@context", NERDM_CONTEXT), - ("@id", "cmps/" + urlencode(destpath)), + ("@id", "cmps/" + urlencode(str(destpath))), ("@type", deepcopy(self._comp_types["ChecksumFile"][0])), ("filepath", destpath) ]) @@ -2543,7 +2543,7 @@ def _create_def_subcoll_md(self, destpath): out = OrderedDict([ ("_schema", NERD_DEF + "Component"), ("@context", NERDM_CONTEXT), - ("@id", "cmps/" + urlencode(destpath)), + ("@id", "cmps/" + urlencode(str(destpath))), ("@type", deepcopy(self._comp_types["Subcollection"][0])), ("_extensionSchemas", deepcopy(self._comp_types["Subcollection"][1])), ("filepath", destpath) diff --git a/python/nistoar/pdr/publish/midas3/mdwsgi.py b/python/nistoar/pdr/publish/midas3/mdwsgi.py index db4187229..6d2e77856 100644 --- a/python/nistoar/pdr/publish/midas3/mdwsgi.py +++ b/python/nistoar/pdr/publish/midas3/mdwsgi.py @@ -6,7 +6,7 @@ This web service provides the public access to the metadata and the data files provided by the author to MIDAS. """ -import os, sys, logging, json, re +import os, sys, logging, json, re, urllib from wsgiref.headers import Headers from cgi import parse_qs, escape as escape_qp from collections import OrderedDict @@ -96,6 +96,7 @@ def __call__(self, env, start_resp): class Handler(object): badidre = re.compile(r"[<>\s]") + enc = "ISO-8859-1" def __init__(self, app, wsgienv, start_resp): self.app = app @@ -129,7 +130,8 @@ def add_header(self, name, value): # thus, this will raise a UnicodeEncodeError if the input strings # include Unicode (char code > 255). e = "ISO-8859-1" - self._hdr.add_header(name.encode(e), value.encode(e)) + onerr = "backslashreplace" + self._hdr.add_header(name.encode(e, onerr), value.encode(e, onerr)) def set_response(self, code, message): self._code = code @@ -410,10 +412,22 @@ def send_datafile(self, id, filepath): self.set_response(200, "Data file found") self.add_header('Content-Type', mtype) - self.add_header('Content-Disposition', - 'inline; filename="%s"' % os.path.basename(filepath)) + outname = os.path.basename(filepath) + try: + outname.encode("ISO-8859-1") + self.add_header('Content-Disposition', + 'inline; filename="%s"' % outname) + except UnicodeError: + outname = urllib.quote(outname.encode()) + self.add_header('Content-Disposition', + 'inline; filename*=UTF-8''"%s"' % outname) if xsend: - self.add_header('X-Accel-Redirect', xsend) + try: + xsend.encode("ISO-8859-1") + self.add_header('X-Accel-Redirect', xsend) + except UnicodeEncodeError: + xsend = urllib.quote(xsend.encode()) + self.add_header('X-Accel-Redirect', xsend) self.end_headers() if xsend: diff --git a/python/tests/nistoar/pdr/distrib/data/1491.1_0.mbag0_4-0.zip b/python/tests/nistoar/pdr/distrib/data/1491.1_0.mbag0_4-0.zip index b2940ca04f31887a3b45a19ca6da2b6960817c76..57b1d6194870a2cc487c0277f1fd589afe6f42d9 100644 GIT binary patch literal 17526 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 sPFVPU{(KgJI`!`&I5Uj~fjFKOV literal 15806 zcmcIqbzBt87F|kGN=iVarKLM01*B7&B?W1g20=n;k?xX|l2oLnLy+!}5~UlZ-lFgO z0QD(?Z}|=AUvu`{Gxy%Pb7by7K_dW;KF>{1B)|USzrUCO_y8t;24P`F5e8NcAt5FK zc0pl!7A6LM7B+fTb_O8<79j>^4hA{~EqXdr9iSn-7BemVO+^KG0Mt7@kQ!<@NX^C` z5dZ-_2L%9p{Uvj1v!E|`TiL*y9WCzjZ3f=e2t)_62mQP2(azuPDgZPT1JNq!TUi^K zn{g7-({ZpNC;$y%ZTg1-)(BDey84F4d<=RD4bcJ%0YIkw5Tq2QXyBB z4sgWLG2(|9jA(xiG2|B9gKX>LhnnV?nac}f*B2 zx%kFkWy=KoV--vZfn{*_NVsih67G=n@M%`)ViuX1dmd@rs2w|9F*0PQ*D~z?j`}%ssi}<#$OxQJ z&lvKfasj1>kK+gCtPGss&l&Q6cQrW5#wOUk*Zegx`~TG?5nh#dZwQRsUkaHoM@VY1vOq-bB>JjB5heM!?3J!;xYl z7q-tq9nPllVWE3^YuB@_94Gm@xL3_jM}Z*m1{M>TkE3-_K1}sZb-+~#91!c@@$u(X z`fG9fmbj1NNHV7`vN9nL$>t}WQ*t_Su`6``PrTmElRt&5AD9^UO(5la(rZWze784@sK(2W<=$;4>B zY^m-ej#UcqwM({_PgS0?+F(AzL^ki2I}I0|)G5uH3Vz6$2Qso-_XI zqW1A6>f+A@%k|>1Su!M;q0`@3dfH~Rq4zjIr6oL7o`H+0*GG*q#Z9s-@cdGu6S7h) z16<~9b`0u}rNeQsdP=w#v6poKb6hEp2+uUTnL7(68{8`ac+W?;g_XXwzLhPViMipg z&Pq=Bu-PO%>Z9ddjKcmI?M8UgQbb8A#UU@MT|n5KODkrRgpDwn(p4OUSkIv)S}=p_ z4?nLW3|`xd&f#`-`J^8iY^_2Ax2IE!6!7>$o?)gb$Js z@Y7z^VleiUcP)6UX-!c-on(N{Qs*ZsXl(3EAdc9-stO;ky6q;z)MVac!`AY}r*3)N z*6%6Fx-fzUu6GB5vw>2XX0PtnwRU?*hSgF9>)Ej+%NwXyuCtmwun)k;#53avG5<9B zX2TKG9eS^;$7v`oq3oJbh^Fv@n=Dk-p`_WbI4@JfsX~nkh%UH=neJo8S0GEV6R@Za@hk;*DXEb!)TX0QG9I9N6!CEe6NOc{0e)8a>Mkf4a*OFT>yG1d$p^X(CN&NNs-!%ZX4vYiqwa52TQo6FLMHM(`r*;1DJ=* zm8~{Ltdvtb(UUK*wPJyCF*zxjxbv$TiUZ{j|QP2~Iy7Y5g2i_hyz@$}UmPC$* zd5>{uAn9$is2NP8IAV&JpXTjB{CH~$G{_NmfZQH06f@(}`GBl&+Qtbzcb7c+c6L3A z&P2krhb1d)ShfkNc|IDMilk;X^WeR$N8EOxobc98JC+#idi$rNG&7*=+;nBD@Jt;B z+8(`JxlO|EaO&2_K0(cEo6kl*aLy&Hx6;J;--t*F2$gtRqcq`(bohDUQslq`Jg=w3`}Y9Z1aqcA4Eh5W7FVH3pKlrG6$dR(Qcik z2t5nYxQc)W$E{5VYld=dE#H{JE#D2^(_0Be`r3+DV$H31lD(#Q?m=I-MWYP>saeH* z*0CE*qlU%V-~=r1>1N%S$5pP13)t%?la02s6@A;) ziOGF4nD2D1vMgTHLISHP5WLRWS^#y-ZGL-AGYyiwQ+EsL(egUAl{!j^hK62T$OJLX zPX0SD7;{T<)7ri$#w#!9^4M|^5C|Y0)>ngX>;^K~V|YT0qNzb*dl16fkMubWR8(v% zXg`B$;Jz%^NV@q>B@!K(HY2eP*=c}&b6N;yK_(_Q9qE&Y4C1A{+7GbYPX{k0^~fYo zz%7BAV{+07N9f5Ac?;rnR4`jNKUpa*DQ~`?M8Jv+EK%F1-=JMTvL##3Y9vVyxIYj5ii7XTS4k``c{6<2$<@F zfXDYwYw+DO`{(!1pU(nB&sU@V-SxyB^bgugQyQGYO0ep@!FlYQZTU|TnCV;TnI2y( zjz$JQ85;!1wVHubTloiS=Sc;BbBfFWG*c$x|nxS4C_i&M9NGL zr9UwzeC%M{Xq3xq(LFYZBAuWHu^e(gy@Fs58y`Hy^0W^%)7mzWJ&a zA|NtiAcf;Td)sWbHVgvm^Sb!*;W_@-Td4}3_~Xzl!)w_T(#FL0GY_sJt+-J48mu8L zO^rVosTJ!N?kg*kz8-Q7xepHm-;$R6`rg5S^$i&5P}_lf`xeX-Wtb3%sX5jSbZ`($ zI|^d+X?PVRxNsXn?*aQW5AWE1WOfn+^vgA)dXl|-&88YRFh(N!fKRGD;A6RMVzB%= z|Di(M?8?mg?%}*zuvYgBqgrQhugwGbQMzv8^!|EoT58pC43;| zgRBv{{0m(*`A@>CYN^P$w!%I%u$Vq{_hmSWQ`U4yRHr%F!6s=X+^gd4o~G#3uPPA2}3TK+bj_ya8` zI(Btefwk=Ox3v6U1ZUN9^O2S-z*^oMiX6(QPp7d$7RFALk`|V=xT<188jNbhW;)?| zQ>-;p9!D7TG;!Nttj%d1gjRZER(pW72vfYFl|mCrKKQmRx}LWJcFnU#V*Z4tds{N^ zd?1+fD-2;(OLlKJyF&Oxa9Jm`H2T`Cm)hi**s2<+~z0z{fHSvB| zvq^FfX{omV!B{N<7j$3QX8My(Wb!HewZH*_WE3-393M=7Avu*qaUT53J7$rM&PL`r ztam)w^Yw_l^8Esai0aXOs2>R>_+a zMLd{s(H*_g929S=oF5#zx_GS3gNj?0x(bYj_tGjg$k?UxEW<)=hQ=mXX`?aXnzvg< zAA8;2eZ9XCuGtQg)LQ+-#eZi}nKDLKtH$LHtFg6`E%M_0_})z2W`RwY-4d}h$`qhY z36-dOm7RImhK+`^%&f6d9_ z8m+5~A)j-37fFupm9Sq!)v&2me4YJg0{@YZ(6RhG{aYE@bF%l+lC{RB7MK+;KN8c_ zSwZu9h^>_Ic<{@<-WV~>O9$c4;)BIKwmAjfp*Ph{;13|)UWpEg6h!u^=bH|k1O|H$ zsiTVbg(E!D-sTyFQqf7WLBJJ)oTk+@&RSgHk3fpZ6}Y+LzE!64r7*u|NxbixBDpE! zTy9v7;1#DEr4(w*rNG#tg3X8IS9@=-A#bVQ$}5ibj~3>4&`fSg59`#uytRhlJla<< zyP3IqSF}MM8M8EmFt)7bJ{#Pyeb7|&_Qx2D{K)dlACxV*D@w~Xps~AG-qz1+Ke*b! zhHc4S_K9wWMc596xKGD}kKD0Ox>cH2wC7G!rcS>zE3SWMX%y0gJnH_ZZxP^<7!XT+9-t*#hTFz2Zwprj*=4zty zRMGR*M24z2tAs3gkLay>Z}x~~@w5?sJb>70B%rJfZJq0OZoJ*89bbR1TuG9KiVHVB z5>1mTK6Gcx;}QAuBpUzJ`Nxz?fjCWbk94(KbJD1$nqBU9UUlP(dm_;nu!R7Xk!Hu4 z@HxwiEy{tP9nquu>U*?p8QAwUk{>)q@f)kv$%~AF4J|`PLLBE01D{1~7I^GO;h-=x zRnA~Zb%Jy*zk|M`Cj(2k9GY@Pz`5SL>?0mZf&$^*r71F_)ofm`U`S7w{H@{-hfCve z#2dFq7g=t*8XO*^1dgQ3VHaU2-I!G~>#Q}F7e`fLYXqW(R7VG-;Qe54#;wyRKDYH+sX{K+QC$%3UPWiU7eR<3zVGYX6#h%5eZ}OUr z(NHWNkA9zEI&sBiB=;7Nx}9kqGOJ=ymm1ZME>AsFRCZDO=a-!P4dHJHd$|zx8x=@p z-y+rAaBw5N!Wc0;WpVhvU}))+WN)_ws$kT}0`t4k96b_s)V61SeneRPxKvuJ))w^l zI}N1`5223x$nRfwr2k$=_umoc9~471Hazxfa502|1^`t4K9KK{+W+eBFA3hmGnV3cAu4MpE)%~N2>q_r!j_24Dp=u(FdF1E!DD)o(waS_c7dl=5Oek>E_Ajk3TqBii&f& zkHII44cs57{vVK>@o4>fb%LB3icHayD*#`eI5tBYDJguz!t)2jNr}1~-W(G62Fs_z z`NKgAEwnE!w684Au{$?=7^lLFleSLPZ6gf%`}0NaTZ-J^6S+Iu^d)Z?1hIuh!Z76K z=jBk3*m6&!O(pEZI^>(?B&;Y@%9}yT_y`hAZKZcDl;B&iS;An10n-u+SMDspFAiaGgrAjaA3kv-?VR@MHE3Euu;NWoGCmUi?@}J zlY+^=<5$KjRe?-B1L{|P|E^#un@g0>!Sb*}Y4n*!IM6d|Wnyce;7SOyO!1m4;1Xqo zeq@<)uK}vf##VoOCw*}bU7dNd#uC%=OATaV=l2_pbtE4;x2_$xjYrvk;yIRaDR{{L z5G)VLzaxz^sv)Qb;SD`_u*2)slSP;OG7kEB%`P@c#$sj6ptCO;xkKczb>DH{QvI#QG-VJpFn7Kd9&lSLOc{ z-5=%9y7IO=?8BJ*Ghog?#S~>&ALj-^R*(zZ;|4APms@!XIfiNwHqcq-4aJ%$-C6c*<`7?Mv(jT!bB4E)>mIr6g6&z2Y_Q$5lJ zgjGK4+L9iK?kpoB4`01Mi|BkJM%`P7tnlY#jd|bWtd^H9M7?n6YXDWydu(Efrd5JGcBG+}Lhqe=|%5uiWwA7v19R3(Cvd$dsD;>%{F3 zYS|rX7l_+neMdq90J47%z!~){*D6&Dp8jo9XA?@LGSI3wWxD%9O%lnn6M4oigyZhX zE${+Xm$T!F#2*UgsK-VPMvZPNKj~}+xG3JiPGM20Dah|&Lt)wtmuPZa#^JP_G4mHdWsqa)E4+hRzV(i&SHtrl+=H49st8IW%EE1NQNO{w;RPR%`GJ&*$fi4C zXpjuij=jj+#KbpKWm$?9GgKUHE^DP24UaOTb5O^rgpeN@$*LxCSBpw6#2OPSJ(YvP zZbOfOkd3UlC*|Lz)D)TlPf2;8&w)csnpAg}isO+xM;t_RCqV!Nq9Y_ODHJ1G(0VZ? ze)Bzsc%@frY9+zr&+KT6_ytr6F;f6H$?nOz6>%wLH)NK!Va|+Kj=i>wDo*_plr_J&9RzpD-g1b6&`jO4ayl?h4$xI3=r24xh4gvBQFH=^;b0X`+yoX2K^t8IT&u zD2jIP3hKJ#8`&Ih4kEJ=zTGXi76 z(>lJk)LGZbV2ZTT^c7`-C?!$E*9yVyl1&O|998ZD7RJQOUTF2{vt$qWdXTp{s$+T~ zOU5sWdy1#aqCajnD(ej-7<$%du+8Sds|Pb!EgdSdiClV94u}S1e*g(x@&2ylL){IA z%5qTdRlg_R1JKC1Epnl*G~%xIf=UNy(*loDuO-#VMr}4_bosIkXh^wSCnMx2C)&2z zd{+GBcKU&V@^*251+A`W>wv6>9&%LLJj>2iEbCMU7v&-9?jDEnW`Ky4 zs|b0xcEQpxdFC#k#SeHSfiK}dtbewp3@+rRDz=)r>^Z%Ht^o3YG)c3U$wxM3h9n7} zujr~t>BejbG!AmogN8C<720yhK-W{4@idXk*3zU{qIyqb$~={VS9gQId=)P$JsN8{ z0eW(4Ot$(uvBYfaYis0zSV0Setw)@xax^Ya`m$tpV!5u@7>|j1>~j`Rv~9gN|SCIAi? z`_Ts#u+M+=_s{(@;Hm}l&DHvymGAqFPkUOwZ4549fTD+{=i3bF1~13B$QJqd&t+)kXA zhOa>Wai)S9`3;aCEv6@dtXvexH&gGw4nr`WpO{U*SLi?5IQq+XN*}f0%6uVWjz%VD zlgVkX=t)wz!Izl}f;f4rI*VL>bby`&wEcGhT_9TAr=nE~b1tI(^;@1LR7Ycj(;m;0 z%-p%H<=~oE8>GVg}&Nl?# zdXR9Gb0PS5KK=FR9(j0v(~O)<^`fVe2NLSV5S%E;XUh3UiR84K=VU|z|00@`xBK76 z>HAl)(<}|3{{@!*b&C87&2ch0?Gri4lIoSehvuv-eZ%#m>EI-;RLqOv`VPyH1>p~L zEqzMYV^=SR<%F(}=douC-03&XlLQ&!{&i5_arP7U+OOI^!Bd>Q#{UcOe%JaPm+zBF zN#+y~wrhU{$jSEa%*pBWyV=R;)%+h&oi%*NY2oza%}IPC*Z&G@XNC0hKq{XKBtFq! zfpjvEe|j2Ezm1&aE9d_Q?qVF?KE)vt>BTraHE};%20J}(Kgn6Z-ve`2j*g{&dT4wS zmKOQNI6597|DK>9XJIFipi^B8$;rtW7|YRQ?1vf%1HNtn0L0**NpN4%0NxP*_zzlr BLwo=L diff --git a/python/tests/nistoar/pdr/preserv/bagger/test_midas.py b/python/tests/nistoar/pdr/preserv/bagger/test_midas.py index 7820c2001..d23604796 100644 --- a/python/tests/nistoar/pdr/preserv/bagger/test_midas.py +++ b/python/tests/nistoar/pdr/preserv/bagger/test_midas.py @@ -492,7 +492,7 @@ def test_available_files(self): datafiles = self.bagr.available_files() self.assertIsInstance(datafiles, dict) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) self.assertIn("trial1.json", datafiles) self.assertIn("trial1.json.sha256", datafiles) self.assertIn("trial2.json", datafiles) @@ -505,7 +505,7 @@ def test_available_files(self): # copy of trial3a.json in upload overrides self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(uplsip, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) def test_baggermd_file_for(self): self.bagr.ensure_base_bag() @@ -596,7 +596,7 @@ def test_ensure_data_files(self): self.bagr.ensure_data_files() self.assertIsNotNone(self.bagr.datafiles) - self.assertEqual(len(self.bagr.datafiles), 5) + self.assertEqual(len(self.bagr.datafiles), 6) self.assertEqual(len([d for d in self.bagr.datafiles.keys() if d.endswith(".sha256")]), 2) @@ -643,7 +643,7 @@ def test_registered_files(self): datafiles = self.bagr.registered_files() self.assertIsInstance(datafiles, dict) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) self.assertIn("trial1.json", datafiles) self.assertIn("trial1.json.sha256", datafiles) self.assertIn("trial2.json", datafiles) @@ -655,14 +655,14 @@ def test_registered_files(self): os.path.join(revsip, "trial2.json")) self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(revsip, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) def test_available_files(self): revsip = os.path.join(self.revdir, self.midasid[32:]) datafiles = self.bagr.available_files() self.assertIsInstance(datafiles, dict) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) self.assertIn("trial1.json", datafiles) self.assertIn("trial1.json.sha256", datafiles) self.assertIn("trial2.json", datafiles) @@ -674,7 +674,7 @@ def test_available_files(self): os.path.join(revsip, "trial2.json")) self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(revsip, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) def test_fileExaminer(self): # turn on asyncexamine (but turn off autolaunch so that we can test diff --git a/python/tests/nistoar/pdr/preserv/bagger/test_midas3.py b/python/tests/nistoar/pdr/preserv/bagger/test_midas3.py index d3de323d7..20b302660 100644 --- a/python/tests/nistoar/pdr/preserv/bagger/test_midas3.py +++ b/python/tests/nistoar/pdr/preserv/bagger/test_midas3.py @@ -107,7 +107,7 @@ def test_pod_rec(self): def test_available_files(self): datafiles = self.sip.available_files() self.assertIsInstance(datafiles, dict) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) self.assertIn("trial1.json", datafiles) self.assertIn("trial1.json.sha256", datafiles) self.assertIn("trial2.json", datafiles) @@ -120,7 +120,7 @@ def test_available_files(self): # copy of trial3a.json in upload overrides self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(self.sip.upldatadir, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) def test_registered_files(self): pod = utils.read_json(os.path.join(self.revdir, "1491", "_pod.json")) @@ -130,7 +130,7 @@ def test_registered_files(self): datafiles = self.sip.registered_files() self.assertIsInstance(datafiles, dict) - self.assertEqual(len(datafiles), 4) + self.assertEqual(len(datafiles), 5) self.assertIn("trial1.json", datafiles) self.assertNotIn("trial1.json.sha256", datafiles) self.assertIn("trial2.json", datafiles) @@ -143,7 +143,7 @@ def test_registered_files(self): os.path.join(self.sip.revdatadir, "trial2.json")) self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(self.sip.revdatadir, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 4) + self.assertEqual(len(datafiles), 5) def test_fromPOD(self): podf = os.path.join(self.revdir, "1491", "_pod.json") @@ -775,7 +775,7 @@ def test_ensure_data_files(self): self.bagr.ensure_data_files(examine="sync") self.assertIsNotNone(self.bagr.datafiles) - self.assertEqual(len(self.bagr.datafiles), 5) + self.assertEqual(len(self.bagr.datafiles), 6) self.assertEqual(len([d for d in self.bagr.datafiles.keys() if d.endswith(".sha256")]), 2) @@ -836,14 +836,14 @@ def test_registered_files(self): os.path.join(revsip, "trial2.json")) self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(revsip, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) def test_available_files(self): revsip = os.path.join(self.revdir, self.midasid[32:]) datafiles = self.bagr.sip.available_files() self.assertIsInstance(datafiles, dict) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) self.assertIn("trial1.json", datafiles) self.assertIn("trial1.json.sha256", datafiles) self.assertIn("trial2.json", datafiles) @@ -855,7 +855,7 @@ def test_available_files(self): os.path.join(revsip, "trial2.json")) self.assertEqual(datafiles["trial3/trial3a.json"], os.path.join(revsip, "trial3/trial3a.json")) - self.assertEqual(len(datafiles), 5) + self.assertEqual(len(datafiles), 6) def test_fileExaminer_autolaunch(self): # show that the async thread does its work with autolaunch diff --git a/python/tests/nistoar/pdr/preserv/data/3A1EE2F169DD3B8CE0531A570681DB5D1491.json b/python/tests/nistoar/pdr/preserv/data/3A1EE2F169DD3B8CE0531A570681DB5D1491.json index ceb9e5178..4ec9f4bbd 100644 --- a/python/tests/nistoar/pdr/preserv/data/3A1EE2F169DD3B8CE0531A570681DB5D1491.json +++ b/python/tests/nistoar/pdr/preserv/data/3A1EE2F169DD3B8CE0531A570681DB5D1491.json @@ -203,6 +203,28 @@ ], "valid": false }, + { + "filepath": "trial3/trial3\u03b1.json", + "checksum": { + "hash": "7b58010c841b7748a48a7ac6366258d5b5a8d23d756951b6059c0e80daad516b", + "algorithm": { + "tag": "sha256", + "@type": "Thing" + } + }, + "mediaType": "application/json", + "downloadURL": "https://data.nist.gov/od/ds/3A1EE2F169DD3B8CE0531A570681DB5D1491/trial3/trial3%CE%B1.json", + "size": 70, + "@id": "cmps/trial3/trial3\u03b1.json", + "@type": [ + "nrdp:DataFile", + "nrdp:DownloadableFile", + "dcat:Distribution" + ], + "_extensionSchemas": [ + "https://data.nist.gov/od/dm/nerdm-schema/pub/v0.2#/definitions/DataFile" + ] + }, { "description": "Simulation of experiment", "filepath": "sim++.json", @@ -328,4 +350,4 @@ "filepath": "sim++.json" } ] -} \ No newline at end of file +} diff --git a/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/_pod.json b/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/_pod.json index 4a0e0b08f..6ee6e12fd 100644 --- a/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/_pod.json +++ b/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/_pod.json @@ -36,6 +36,12 @@ "downloadURL": "https://data.nist.gov/od/ds/3A1EE2F169DD3B8CE0531A570681DB5D1491/trial3/trial3a.json.sha256", "mediaType": "text/plain" }, + { + "description": "Third trial of experiment", + "downloadURL": "https://data.nist.gov/od/ds/3A1EE2F169DD3B8CE0531A570681DB5D1491/trial3/trial3%CE%B1.json", + "mediaType": "application/json", + "title": "Trial 3-alpha: JSON version of the Mathematica notebook" + }, { "description": "Simulation of experiment", "downloadURL": "https://s3.amazonaws.com/nist-midas/1491/sim%2B%2B.json", diff --git "a/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/trial3/trial3\316\261.json" "b/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/trial3/trial3\316\261.json" new file mode 100644 index 000000000..eb50c4db6 --- /dev/null +++ "b/python/tests/nistoar/pdr/preserv/data/midassip/review/1491/trial3/trial3\316\261.json" @@ -0,0 +1,5 @@ +{ + "name": "tx3a", + "date": "2017-02-02", + "result": false +} diff --git a/python/tests/nistoar/pdr/preserv/service/test_siphandler_restricted.py b/python/tests/nistoar/pdr/preserv/service/test_siphandler_restricted.py index d32faa4a8..4128cf439 100644 --- a/python/tests/nistoar/pdr/preserv/service/test_siphandler_restricted.py +++ b/python/tests/nistoar/pdr/preserv/service/test_siphandler_restricted.py @@ -318,7 +318,7 @@ def test_update(self): nerdm = bag.nerdm_record() self.assertEqual(nerdm.get('accessLevel'), "restricted public") self.assertEqual(nerdm.get('disclaimer'), "Be careful.") - self.assertEqual(len(nerdm['components']), 9) + self.assertEqual(len(nerdm['components']), 10) self.assertEquals(nerdm['version'], "1.0.1") # serialize @@ -347,7 +347,7 @@ def test_update(self): nerdm = bag.nerdm_record() self.assertEqual(nerdm.get('accessLevel'), "restricted public") self.assertEqual(nerdm.get('disclaimer'), "Be careful.") - self.assertEqual(len(nerdm['components']), 9) + self.assertEqual(len(nerdm['components']), 10) self.assertEquals(nerdm['version'], "1.0.1") diff --git a/python/tests/nistoar/pdr/publish/midas3/test_mdwsgi.py b/python/tests/nistoar/pdr/publish/midas3/test_mdwsgi.py index ddbfd1080..d12bdce8a 100644 --- a/python/tests/nistoar/pdr/publish/midas3/test_mdwsgi.py +++ b/python/tests/nistoar/pdr/publish/midas3/test_mdwsgi.py @@ -116,7 +116,7 @@ def test_good_id(self): self.assertGreater(len([l for l in self.resp if "Content-Type:" in l]),0) data = json.loads(body[0]) self.assertEqual(data['ediid'], '3A1EE2F169DD3B8CE0531A570681DB5D1491') - self.assertEqual(len(data['components']), 8) + self.assertEqual(len(data['components']), 9) for cmp in data['components']: if 'downloadURL' in cmp: self.assertNotIn("/od/ds/", cmp['downloadURL']) @@ -172,6 +172,26 @@ def test_get_datafile2(self): self.assertGreater(len(redirect), 0) self.assertEqual(redirect[0],"X-Accel-Redirect: /midasdata/upload_dir/1491/trial3/trial3a.json") + def test_get_datafile_unicode(self): + req = { + 'PATH_INFO': '/3A1EE2F169DD3B8CE0531A570681DB5D1491/trial\xce\xb1.json', + 'REQUEST_METHOD': 'GET' + } +# body = self.svc(req, self.start) + hdlr = wsgi.Handler(self.svc, req, self.start) + body = hdlr.send_datafile('3A1EE2F169DD3B8CE0531A570681DB5D1491', + u"trial3/trial3\u03b1.json") + + self.assertGreater(len(self.resp), 0) + self.assertIn("200", self.resp[0]) + redirect = [r for r in self.resp if "X-Accel-Redirect:" in r] + self.assertGreater(len(redirect), 0) + self.assertEqual(redirect[0], + "X-Accel-Redirect: /midasdata/review_dir/1491/trial3/trial3%CE%B1.json") + mtype = [r for r in self.resp if "Content-Type:" in r] + self.assertGreater(len(mtype), 0) + self.assertEqual(mtype[0],"Content-Type: application/json") + def test_test_permission_read(self): hdlr = wsgi.Handler(self.svc, {}, self.start) body = hdlr.test_permission('mds2-2000', "read", "me") diff --git a/python/tests/nistoar/pdr/test_utils.py b/python/tests/nistoar/pdr/test_utils.py index e0006a93c..336b46d1c 100644 --- a/python/tests/nistoar/pdr/test_utils.py +++ b/python/tests/nistoar/pdr/test_utils.py @@ -8,6 +8,7 @@ testdatadir = os.path.join(testdir, 'data') testdatadir3 = os.path.join(testdir, 'preserv', 'data') testdatadir2 = os.path.join(testdatadir3, 'simplesip') +testdatadir4 = os.path.join(testdatadir3, 'midassip', 'review', '1491') loghdlr = None rootlog = None @@ -96,6 +97,8 @@ def test_checksum_of(self): self.assertEqual(utils.checksum_of(dfile), self.syssum(dfile)) dfile = os.path.join(testdatadir2,"trial3/trial3a.json") self.assertEqual(utils.checksum_of(dfile), self.syssum(dfile)) + dfile = os.path.join(testdatadir4,u"trial3/trial3\u03b1.json") + self.assertEqual(utils.checksum_of(dfile), self.syssum(dfile)) def syssum(self, filepath): cmd = ["sha256sum", filepath] @@ -285,6 +288,14 @@ def write_test_data(self): with open(self.testdata) as fd: data = json.load(fd) + def test_write_unicode_name(self): + data = utils.read_json(self.testdata) + data['foo'] = 'bar' + outf = self.tf(u"d\u03b1ta.json") + utils.write_json(data, outf) + data2 = utils.read_json(outf) + self.assertEqual(data2, data) + def test_writes(self): # this is not a definitive test that the use of LockedFile is working data = utils.read_json(self.testdata)