From ae32dbba37f6506e497eb63b0c4eecf602e48ffd Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 4 Feb 2014 19:23:34 +0400 Subject: [PATCH] updater tests and test data moved to 'updater' module --- updater/testData/Readme.txt | 166 +++++++++ updater/testData/bin/focuskiller.dll | Bin 0 -> 32768 bytes updater/testData/bin/idea.bat | 66 ++++ updater/testData/bin/idea.properties | 105 ++++++ updater/testData/lib/annotations.jar | Bin 0 -> 10903 bytes updater/testData/lib/annotations_changed.jar | Bin 0 -> 10495 bytes updater/testData/lib/boot.jar | Bin 0 -> 13161 bytes updater/testData/lib/boot2.jar | Bin 0 -> 13324 bytes .../boot2_changed_with_unchanged_content.jar | Bin 0 -> 13324 bytes .../lib/boot_with_directory_becomes_file.jar | Bin 0 -> 7368 bytes updater/testData/lib/bootstrap.jar | Bin 0 -> 32264 bytes updater/testData/lib/bootstrap_deleted.jar | Bin 0 -> 21618 bytes .../com/intellij/updater/DigesterTest.java | 21 ++ .../updater/PatchFileCreatorTest.java | 333 ++++++++++++++++++ .../com/intellij/updater/PatchTest.java | 192 ++++++++++ .../com/intellij/updater/PatchTestCase.java | 41 +++ .../com/intellij/updater/RunnerTest.java | 25 ++ .../com/intellij/updater/UpdaterTestCase.java | 72 ++++ updater/updater.iml | 3 + 19 files changed, 1024 insertions(+) create mode 100644 updater/testData/Readme.txt create mode 100644 updater/testData/bin/focuskiller.dll create mode 100644 updater/testData/bin/idea.bat create mode 100644 updater/testData/bin/idea.properties create mode 100644 updater/testData/lib/annotations.jar create mode 100644 updater/testData/lib/annotations_changed.jar create mode 100644 updater/testData/lib/boot.jar create mode 100644 updater/testData/lib/boot2.jar create mode 100644 updater/testData/lib/boot2_changed_with_unchanged_content.jar create mode 100644 updater/testData/lib/boot_with_directory_becomes_file.jar create mode 100644 updater/testData/lib/bootstrap.jar create mode 100644 updater/testData/lib/bootstrap_deleted.jar create mode 100644 updater/testSrc/com/intellij/updater/DigesterTest.java create mode 100644 updater/testSrc/com/intellij/updater/PatchFileCreatorTest.java create mode 100644 updater/testSrc/com/intellij/updater/PatchTest.java create mode 100644 updater/testSrc/com/intellij/updater/PatchTestCase.java create mode 100644 updater/testSrc/com/intellij/updater/RunnerTest.java create mode 100644 updater/testSrc/com/intellij/updater/UpdaterTestCase.java diff --git a/updater/testData/Readme.txt b/updater/testData/Readme.txt new file mode 100644 index 000000000000..c509af0d5f17 --- /dev/null +++ b/updater/testData/Readme.txt @@ -0,0 +1,166 @@ +IntelliJ IDEA 8.0M1 - README + +Thank you for downloading IntelliJ IDEA! + +IntelliJ IDEA is a multi-platform Java IDE, which includes intelligent editor, rich-featured GUI designer, +visual debugger, javac/jikes/rmic compiler integration, refactoring, enhanced project navigation, +intelligent code inspection and analysis features, J2EE and JDK 1.5 support. + + +Contents: +========= + BUILD.TXT File containing the current build number + KnownIssues.TXT Known issues and workarounds + README.TXT This file + bin/ Startup scripts for launching IntelliJ IDEA + help/ Online help files + jre/ Bundled JRE + lib/ Library files + license/ License files for IntelliJ IDEA and bundled software + plugins/ Standard plugins + redist/ Contains libraries that need to be redistributed with your application if certain IDEA features are used: + - forms_rt.jar should be distributed with your applications that use GUI forms with + the "GridLayoutManager (IntelliJ)" layout manager + - javac2.jar is an Ant task for building applications that use IntelliJ IDEA's UI Designer + bytecode generation or @NotNull assertions generation + - annotations.jar contains JDK 1.5 annotation classes for 'Constant Conditions & Exceptions' inspection tool. + + Install-Linux-tar.txt Installation instructions for Linux (included in Linux installation package only) + Install-Windows-zip.txt Installation instructions for Windows zip-file (included in Windows zip installation package only) + + USER_HOME/.IntelliJIdea80/ + + config/ Configuration files (See INSTALLATION_HOME/bin/idea.properties to tweak location of the configs) + codestyles/ User's code style settings + colors/ User's colors and fonts settings + fileTemplates/ Custom file templates + filetypes/ Custom file types + ideTalk/ ideTalk settings + inspection/ Executable file and auxiliary data for running offline code inspections + keymaps/ Contains files with custom keymaps + migration/ API migration map + options/ IDE options configuration files + plugins/ Directory for custom plugins (it appears after the 1st plugin is installed) + shelf/ Shelved changes (in standard .patch file format) + templates/ Live templates, both built-in and custom + tools/ External tools + idea70.key File containing your license key (editing not recommended) + + system/ Various IDEA internal caches including Local History data storage. + (See INSTALLATION_HOME/bin/idea.properties to tweak location of the caches). + Also log directory with IDEA log files is located there. + + +Installing IntelliJ IDEA +======================== + For Linux and other Generic Unix users: + Please read the contents of the Install-Linux-tar.txt file. + + Installing on Mac OS: + IntelliJ IDEA is distributed as a .dmg file. You only need to drag it to + the destination folder, from which you can start the application. + +Uninstalling IntelliJ IDEA +========================== + If you installed IntelliJ IDEA with the help of Installation Wizard, then + just run the INSTALLATION_HOME/bin/Uninstall.exe file + + To uninstall IntelliJ IDEA after manual installation, simply delete the + contents of the IntelliJ IDEA home installation directory. + + +Licensing & pricing +========================== + Licensing and pricing information can be found at http://www.jetbrains.com/idea/buy/index.html. + + +IntelliJ IDEA Overview +========================== + For general info and facts on IntelliJ IDEA, you can refer to IntelliJ IDEA Info Kit at + http://www.jetbrains.com/idea/documentation/product_info_kit.html. + + +IDEA Development Package +========================== + Contains: + - Source code for the OpenAPI classes; + - Documentation (JavaDocs for the OpenAPI and a number of additional components); + - Simple example plugins demonstrating usage of the OpenAPI; + - Source code for plugins shipped with IDEA: + * Plugin Development Kit + * IDEtalk plugin + * Images support plugin + * Inspection Gadgets + * Intention PowerPack + * J2ME development support plugin + * JavaScript support plugin + * JavaScript inspections plugin + * JavaScript Intention PowerPack + * GWTStudio plugin + * KlassMaster stacktrace unscramble plugin + * StrutsAssistant plugin + * StarTeam, Perforce, Subversion, Visual SourceSafe integration + * Tomcat, Weblogic, WebSphere, Geronimo, JBoss, GlassFish, JSR45 integration + + Download page: http://www.jetbrains.com/idea/download/index.html + + Source code of additional open source plugins shipped with IntelliJ IDEA is available in the Subversion + repository at: + http://svn.jetbrains.org/idea/Trunk/bundled/ + + +Using Plugins +============= + IDEA now smartly integrates with the Community web-site which holds a repository of the third-party plugins to it. + This integration, supplied with a convenient UI, helps you incorporate any available plugins without switching from + IDEA settings dialog (Settings | Plugins). + + You can browse the plugins Web site, rate and comment on plugins at: + http://plugins.intellij.net/ + + +Home Page: +========== + http://www.jetbrains.com + + +IntelliJ Technology Network +=========================== + http://www.intellij.net + Early Access to new products, internal builds and patches, Bug/Features database, Forums/newsgroups + + +IntelliJ Community Site +======================= + http://www.intellij.org + The community-driven Wiki site dedicated to IntelliJ products and technologies. + + +Support +======= + For technical support and assistance, you may find necessary information at the Support page + (http://www.jetbrains.com/support/index.html) or contact us at support@jetbrains.com. + + +Bug Reporting: +============== + Send emails to bugs@jetbrains.com + + +Contacting us: +============== + sales@jetbrains.com - Sales inquiries, billing, order processing questions + support@jetbrains.com - Technical support (all products) + sales.us@jetbrains.com - Sales inquiries in the United States + support.us@jetbrains.com - Technical support for US customers + suggestions@jetbrains.com - Feature suggestions + info@jetbrains.com - Product inquiries + + +============= +You are encouraged to visit our IntelliJ IDEA web site at http://www.jetbrains.com/idea/ +or to contact us via e-mail at feedback@jetbrains.com if you have any comments about +this release. In particular, we are very interested in any ease-of-use, user +interface suggestions that you may have. We will be posting regular updates +of our progress to our online forums and newsgroups. +============= diff --git a/updater/testData/bin/focuskiller.dll b/updater/testData/bin/focuskiller.dll new file mode 100644 index 0000000000000000000000000000000000000000..c1f8e043939a01f4c03e8e854fb2869a17fc8f14 GIT binary patch literal 32768 zcmeHv4Om>&we}e}kO79w#DGC1Ix$2|6C=X_GcW^zzz`B44k17=2?>UYfCMO+*|2%dd(w$HL^sy3ze|h$2k2Nd#J0H7~(ytwP%%$Z2484MklBd@ z(cu%Kd?TTxgW-6#lItyD7`qbtmakTZd10LSx6phO+Q~4Z--Hj~7I3aD9OA1j_#*kT z0wIFn$H*}27Bp2=a+M5|7X>VMDzp?%_++8<0+oz060dcDV2Eh&lf^LJ1x>EHhV=}y zg7~!ph^`SZ;giKMizXx|qmvq#)WD<$CN(grfk_QaYG6_WlNy-Rz@!EyHSph{ff8|0 z7&OYUl9MsG9iz3Z=+HXl*g+*Z>?!mYi6x`U<=7!0c4yTv2AjjrhYKyk48K&!$OnSq z7W6v?Vj#O%sC5^f>vs%>A<^#`qUQ8Fq^SrzB?DkW5D|kA~`k} z+2TL1Imj}Qs%`M3QhYdZ9b@Qs_)(FeIu~&{R;LIzRLfLT36EpgS*xioK$ciIR3vqw zn9v)C#t1E=3_n+n)q>txy%GeT$L^428Iqg>O6b*jIw+0yvPh%q9#Th(PQz!&vGG9d zp%z!Sqh$3irRq3hCCA249<@eoiGfO^2~sY&3B9b+sx=37%#kCCezQu27U=0Fux7Ye z(P8Kw2z82uF=%r#igtLp7_{Ic=t7Pi0K)7&e>)CkgqApln=6(Wy8j%qTy(^t;>2$u z_v36rXo+XI1oU8GJQ#l)<(r_C-URm!FMnfOix%2yZJJiAsSO{m``I9~2(cu-9|?4= zLkEG;!d;Zts|{**3PjxwlvtvJR!KW<$B@u6#PHOjT`+`kt|barv`AGzh_e<36IUet zidx#MgPB2@p&@R^uvj=MmS{tZ4DJ%Y?>f;jEO=Q3?H9UPccEV_85YtRefwo747sAV z?JTvT?FxPKA-+F?Ai!&|T1!NQgI86pzed%*r^J#$v$tze2=o!+`(eMMm)hI!I7ERj zLM%KabZgv&hs2UYwh}{gq3Ae-o)crb^{(tb+(u`E=x@a_BMvQ4Z0B>F(ecpC$2ck+G2jd!KALS zXy3{}aqzj$9n*HT6$P)eZmnXx(Xcl$MDS{0!fuVH#0#rGhxVU=6FQ2XW z2JLvkr>G#AoIkY4?k*Xw_A8u*F%|q&?Yv{1Qx-4bKNk;m z4`@TXDKH>-UHEfo_xTVm{L-^18V;JJph5AqJ@{tnODp&_`i@S>D92_&kXp^2D!5oF zHjO*DG8^;5(jrB#ba#BVFk$XWttD$y7~EO(Uf}V53&-bML&TQ zA10YVD1Cx)C#^z7(z6j5(mKH(%1+GE7}IcJ!dM7@>+X06g?S*Nth87@iii#o>7y}OMhnPtmQlLm3Z|DajoYE)b--K7 zoW)WP(Of1rq5N$`^jo!1=q!g$84lBeytN8%6oxZjTd|7fr`;OZ* zw5=G8k+}p`5)i2-P0O)fSV(z!&+Zsi(h&J*wE?JVExx3WK~l|9lA+{jB!yl>Pc2ic z0Uw<-T|wx2FeqW160}BE*;6L{46$0x+O&+PNUPI8td(O6&`lU%`3QvV2|A`&T%8c( z&LG8i&U~B*?Yj-C7`KYiI>bsn-yO9LHBA@8p*x5sTwrY}MAH08MRgp>6+?36ptkbz zY9k@y36Z2AI!>?RrbsgpU)w_xxD{!zAb|jDdupSlDp*iCMP5-Nr6P!IXjgOec!hne z?~{t2QfV)#E_NkK3VwM{FDl{EYq?sD^dl4%hsrxHmveJV!gCqSh-f?4qsW(WA;|`NZY`2H_?M5Hx-ImO+?WO2W9m1XF0R(!zw8&h9;JtAg#Xr zQ6v>%VRq3dxDExyA(%^@n3sThr#Ph@)FLtO4mI_Vno3ktjcUrOrtVWyS!!y9n#xsE zd1}g;L2?k=6hf3r3n+lMp3vM1Wsxp&q#C&Qa(4>TfcAvp zCc$7t8$919O50HL&8-_)MwluK8?;PcURdOAq7(WO!YJSOzQ=I@t!zXqHwY~sV~KDK zg)uXCc=hdl6t#L*vL4n3zjuIv2eA3Khlu{P463K4^i>wjRGD6d$`zj@s4}?2J)MdO z-Ocf>>mY(w7S=(8tguLNs^Cp%>sAC95c*h^+xFl2!bOFz`ErN+PyxAVt#C!=tX-i` zYq+GRwR{wua2-U224{%dVtG?6$8uC zd^&BW7Rk~w_@0^AFNi7Rn$2=oczO?aojrroEH0IPgFY$uaN!!CX13D+amO{?iO9E^;SN&%c;p~{rpyLZu@a=j(-2~%MYL3$QW2oCu`s+vh@2;T^1%X3G0gMyg3iG7`X`464Cm3 z1b?LcI3Jqt)1nTxb%V?Zt~jREicvcNIlBx*8%A`YS-y)3{t)mJg~v);4(WH$5}z@j zZnduF*{mGj2#GZRa*u|eW0uoe;<)J6Et*?BP7TkB2YsRL7A=%vKAu(*r{8tZT@rW9 zC!V+)i;}51BuHQQ>O5IC(N9od zD6}SPvd*u>T1sgp6eerV&!D8tg$lQ$J7O>dWM)lIQPJ+FYZ*gviFjuxOs2HVeA;~3 zEZcf`v-~G<$aaa-^@kA!wbpls9NP{m(Qo@g-~KT$Y97`d%=t&~rL3je5P=Qp)bjfF zgGg^kyIJhxrejIsKICR`oxS@ush~2F3u`0c9s?wyK@tg<#$EN=Hrq|q+gT! z#gNHOFmSVri%XoCCKEsta&c`qDsn2rFobguvCES+D;7nd?9A<+KM%+ zuoN+SYne2x8>{Kk87oydyPcrv@a~c7F$={?2^fr!PcNqsLXO>mT(cL8kd>;>d7+Lm zK;4f6{ZQ`ieMps-i5a_)^fcSznT&xTWx5lzxr)(D3cmvs4ESgj&-pA>H`YbK{QZBlsTnO#}n22l-&1$ zkoOOxO)8C3Is#0!!Keuos@|c{wPSrL^v+-FyUpX!dXxgSj1xY+g@i_=c37PVVIohU zdn*q2l!_@&A%>L+^e4ZAo(qI~17W)oVo3*+pb70&QnWJd&1)N@Lfq`OF)GB})HX(i zxan7;Wrc zYPE8{g$iVquN?a{uxl`+5df~$%Gd3Lqo6~JG zkFIA7n`dH*U4dGQrE;*ZjS&6PFG+}A9YmW~TB{8j{c~V0`hmPv$Vhkq&Eak+m1@yb zw6KctJyTrElu6HBREmoIv=G2P#~)a(av7-R6PQ@3^aRcORAzdqQ+gQ*g3z;b)Am0$-p-wG5f#RCPF{PpBNI3i=Ex2{uh@54o? zEBq8{aM|WrsN_CHl>2po7Vkq+X)(u&{l55X)HOjAQUSVkeD{3hNSU}jLF=pa>`j0K zj40Dyx@@GIMC9~cn(THjXH%2>MN#vzJT~@F=uu%vHXp><*E5Vp)5b|+_9)0^x1Zx~ zdq;GKuc29xC+MdopF10UE zeT>??tYGu#l$iP3ZA?NN6Vx_NzuLxZMQiiAdpy}=#9xVhIUb`X6An&O7>vV$we|*S z&nS$9*GiAkAUauYn|T0!y4<}+%TF<1KHmsz$7y|gDMIt{11B+D)8aTz@Fp(GI0O^e ze$nHQoLI}ffd0g=u=VLXW`VXgOPF&GGYeC0_P#cNB~uzNU3&IcZiT!4`*aT1+HwI- z_7%iDg`aj!Yd@}Ue;x__{%jfR1lvLV-_fB=Yp1eS%JN+hT%%wcvSS-kvWEas-31J^0vESCE{2c}WH?5f7meSroj`q@KGQZ$10tX1dX z7#Oa{F<9!9Q%HrXRVeGN>&bq+uhKfZvpsAO4b8IkH4S$;KI`kClo7+$Qe5UKxuoA8 zso(Flb#I})9DHQ$ne zRs?@`(+z_E-pw&VUWZz{jh&qer&|PnWz%%Qziso>AiG1Y=Z(IBATzLf6*ISxL3>4p zzpnO6DGs%j_lFUJY^8_pTgvFHO)NBsSm<|)$3pvTW1F-#zy9GZAQ|Z=SIfsh%Q%q~ zu4tR)UiyWc@L1e@Oji9bQ>Jj9ZPEz?p`nN5gpR~{P`@R2rc#MCcD85q>#NwNs_Z1I1#> z*)g7j@_Gm{iaLh@gMf2@Gk~`NM*w2(56-!BA329mLMR~|L^z0W2;mUIVT8j7{RsUC zM-gH_=|QuZ(4kO&P!lpWI1yk6I05h-6>AUo?4;ICjH@jVU?Af)+JGv8v>whh>e-$) z8qj~jRsBbQdFdCUsP~0CQHwnC9<;m;QSb`(#}&0d=23qffGnUO;+=;OmjDJNy7EG2 zAM0Ekx(tl(A9tz7C-dp%$SQA&U?PRTKL~ z)sGka4gpRA28nmDU-ClH`U(A@q|w?5eSo%sM#WvzZ`D~C8CMrjv}(a7incPmrbn3b z93qS`hc-DltKIW7!v3(Q@C}#4tnArM86I7$vVrpGI&Iy}F}NmR=Q(w4pVR)SX^P;D z@kwyN%9M=h3d2*2RcE$A{A}KLb>h9F!okt9?hASxgKZnFIn2Tp-R*7}_3Y5(LNfQ7 zVY(L4O}|Vxaen@L-B;M!g-h1D3w5@)Heo}L8;R+xtzf#A&ld}I!WCn4{A&=c^~9$h zyagY5ch>e7a>pY0d8l<(nlC}<9tdQEIzaKt3%w`-qHrSG%7UX-+&-OkD^V6vZRi@m zd#e`0h+lNe>^*|Ka8qdQ!nJfUa~5(9>N}nSi+Q-mEF4uN#P#Kpdu^{n%uQi#wE6YW zHKXDeU_ixfpKl5gKexTbJwVq>MXar8g7hzgQR|7171@r@T5(nSX^QlL?4b0=XYIO1 z`XXEbgQZqn!n&8LaaLTSbuZQ88cS#yWcY}*7M;G`jaqPJ?$KQdQc@gbZg5!2y1`*7 zYg?-2*LM|6VFlUPS*RcD?nJzKPHT&v;ivwd4 z29z9?s+>hS*gNft+!0n0N_7mmZ*;GoJ}PVV9WWd0g<)27aQgv?8NC-Nb#LB%R*#Fa z-!rYWJ)0^` zBW%&id>ytYa-&XuS3${*S9kTw217A=F_y-Nhi&a12oVn{gqY3?rVSQ(@?(me(n31f zc4)CtkfUjk*utnyn?eOCMvSJS?r0iJJ{q@sD9fEf%~Tdd>QI?bO>rqID)ZPM1~H9| z{29X8A&d){+7g(2%Tz3?PFxTQ{j!@M_8DO0!Xepw`GkZd?mc%?P2x%02Uzqr-yq)2 ziniH>{@G(uZ}Cw=PmFENC^DKpLdb6wPuWfqS?o1rVIcE;XgkT5gQ$6$@E~qkwZMVW z_X(A|Em$sE$y4YrfPSiE#ef!1cAN$&7gH>qLb6=E+u+uSIR?QhV-fB>uLsgSQ;{;q zAR2_vWp~La7bEW2N!=!H-Rf`3rEpj*0N*$H=s-2KMpUx4yv4sy|;8)m2^zG4bPk}*Fi2>3wZ+r~UVeWP-J95IkW^nfE&RjQO zOwYsAwRko#E6Qh@I4%@g&kn^xM^4PTVN8!=d{lt=ZWbnjau~qdSfRzwkXORU-ll~^ z(znwNf+XF3k@e^A}e{Bd?brpoO!Wf2dRLk74?$(wlrV|)GN*RjcnoX%LkK4;;Lhw`~1frJznu$^;fDO?1`0*_h?D7)5FU+?&X;G}qbs z-FXJ?JGE>zV+PnWoj*9Br zyTCNCw!NShtwYA${O7AG)MFCmoMj33yn56U9z1Hf9v4pPvCjM0)6d6I%guqK7M*(3 z!uPpn_~P3BOh3*;Y${@?3NhAvT;XZ%DCI8>Pt@tT=cG> zoMY+qTV0CP%GFk=zWV4w#!$5zTp4GTdk%%dU_8!E+%5?hC>iKk_TQpn z8z29@o7JX$wFuTX9glznTWuE}R}EFUqmg2i!PM^`MPnL z&8G<=qV^BCeYkYw&wWKS2>b-(DJ$dIvNB(|Dokl{wGo}7w5nB+pQg0$Vt*s{ov)){ zMFKV>^w_7=vsA`Cnw8nYdIPbiKLiU^H>6(YPH0wjOT1d(EiFjyq3rPA;z3C)=?kenr^Pl50t9>$z%dt!IFe@A_qoIt)-hR zj|*@4uIcr0&!tA7*MHY}hGd65e#3bNew<4CXFmcu&)80(0bh2&I>7iD#os#5Am-Tj zj?)JA$X_|nAgXUZ&j^(N00c(>y?|E$`vA`Y_5z*&U?2RSaGs%PLZ${Y8H_;(Faj`> z{TH8Sv}U3f^*kdHQRpk!9}~|rIw1@CfrxiLj`#t<03dh{@wM{|q6DvC{@*yyP-^cQN-x zt(1k*@`@L=zMiT_l&cSH3)SUH6`u3p)3%kRig<%qq!X9x(r_RUrpVS)T=e?^TtoOG z0}-q)-FIuWlmxu+AR#?Y^4m_oi*@p+L0`!k@}8@Q3dva zczur7Pk2q@&KVV(b>f3sYC)w(w@KLk2%aZ9N=rNs7~~a?uxl#7A^P^iH9(}aQ1ypJ7#o-qLDv-1cAnxm1jFr(M!`1^&O0Rb zc4)-2qE^geojph7IVa(2uR2x5pBB>raf{Xyb_Y!*Td>>+Yy#QX0b044PwzxMw^Kd0EViEHKEoSM3-IDe=vKNDF@)A0?iAi{os`9s zE2Hp)HNegn35IE42okXei%{jIPmz#8Ga!Rb=VzkFamcRU@hf8FzgPdrZi;w~=jj3l zd&t-5a-vpa`=Fv_PFjlYe!P5$LU+CeY-sC+tkktd7Qj2 ze3wM*$_~prv%A6xnWx{wCNzI0cB8$xs!+<~*)47({&E}kA1zvO#O(d-*CX$Rz9Ejm z3NQV#D^E5bPG2lDbcfS_bI&b0R*yPR99X|3R<<*pC_B+>ABT}p|7vf(RV{&xQOpzxIFXz`1ljwFnjTK60ZuQyj{0&v!hOPx8yA@ z!T{WlYb135K8F}aS2-4z5li?#;RSdP7opVJ6f*MOHG^@g!v9y`Ps8zzuXJ3X198fo zn-GUF90#k$iGPB@e0=1hcoH!k!V|u1@esXkrkRIu$Ic%+eeC07C!-GY!y}i(p^>VD zI8fwbO|gM?lV+LuxY$>*>YxELfchyW(m-_zL!~-QZK&*^`MA%i zRA)eSxNb<$exI0D=}^~H)TP~|od?-(T9FWgP>WDEa%$wHaEh5&IYc0) zXsIFU5WaPM1k&utSqNA>a#m@zmZ}J)_G?GZhMxFJ@gtr^@~WP|>j+O(0yakU8-rr; zB>V(~4)_IbdROEk>wDa>_QPCJz*T$_b+Qa@>Mw@UsFPykYxHsg*MB4CH*l|YMYt%_ zBZ{}oeee|cxe(q_@bPn$=M*O>(D2%}4`EHMd~e0tRd6EWqER^KRP6abwVvT_$2)|N z;CFzE1?mh?;Xu9Z`%%SORpLcsDA(gz^rae%QUHFFpGgf&YG6_WlNy-Rz@!EyHSj-9 z13xNfnEEn?X$R~A>;-rM#{nM#Mgh8&3=I&KCm0N4S`02=_?0WSdh0Ph3*fbe@6CI)aTU;!W`;bz>|Qd0s8>G zfa3rO;0I_|G0csC`2hMjA%8Al0pM0ZIKW@3=FvC)H6d5C(PeZsH8nID873N6_A3hR zDK1tqlw^vREL%Jw$>iQsn7w4#Rm}3##3XBU<$9@gD|jI3q_*9GAI3L0Afz*p(NT`z$`^nVN?Zggbjef14Z8=-*U|EJ_!O&e?Kuhny+(w=YZA6Gpz z*igUGRnLJRWKC4s^NqBXP51Le*c{YvViM_TLtO)^tH0ma*ici?DP{mnm8(kCXJO6y zriSK*4VOB)ZEup*|e2xHWEe|L_5fCXGKOj)qlE~4ijb;ELgzU zgRQKugmv@v57akouFqtc#V)R(vYE?<32bsX8yfjW1*fLVYU-;RHZz5;=H|-#U5gsF zWHWrTtI3?SpsKEpYQFlReRxC~V~7S&{0|7b1MzGdV{icS(>HERZ*FF)@R@Hc#K%aH zt@tp7cU9emfN>TwOg13bwcfSyK35afu&iOzc>JFATmzwtU5#82na$tNH**ZLl&@3t zu@v?~<+2-_YDmn&%BJ=B;SQ7My03{3=xk|ay%I$|#Ge6Q;>my)@d4DM+*aa2<*6)# zGE8wL$KzjSD)rjLeL-08>!I#|!-!|Zc&&K~C4SuZT z2Z8&h&;QT9|05=^uClp0VDS%XFfP>i3dPr8IIYJhSW-oYrQ>_JJv`UQbGfej(3Kp@+@H-bHN=%h zrBa4r@RjMpBU}#O)C8Y&wP`a$C(6n&w}mWeUQ}6?gMZQM4wuvKgi&h$-S- zLJ?u6DSzwdB%Y` zCLkeG6uKhdqFq50lm7LVFqso@s*0%J%0pMwHKT#0m30_zrIgC9Q~pp4i&xVxCuXD>1J&E~($pkj-p^AFFe5 zt{f<&2J>q%w1%cLJW;BBLZz3%C!<$Bfmd+399QQR)gqd+nG4^NQ^vSM%WA4zIn|X- zD;f%EZd|mLgEt}mUuVSJ^UZkpiO7(AtV?oT&0JH%Rz|C&axlw+8M7tW%ZiS4N}dvB zejKWFHMN1cA!Nz;BIm2^eS~q;V|x86npqrD;Hup8HT5vzN*!wVjM5yH<0OSLf2DYK z4*Zu$ExE^0NO3+WU!Xq?O6lb;HTgiuxL#H?1eL|4hZN)#RyK~0IorfE^zmEbujW$U zqIX`p76Y0iAY+aJu3 zUt9lFZswE?!o_!f8nFK#1Q2 zGt~&EBeWxoL&ze$0pXb<#&9FTy$EkYSci~)Se%QH+L4TqHVz30w;_x{IEv7Kke&iC z2q}00Kl-Qe+dczd$@hOHedsIcZ{zb{fyYZ0Z&ZLW{(+L04a9#mA?`t(^i7{1Oo-#* z<2Zijg!rQq;y;`a|N9AXdL4lGkPPX0Vz+BT=y#py6A-L>c9Yg$`$7NK&(Hn*M&_S?F8w@k zI5nY`asChOR!S5>u|=mUP8pfCr)p0nO`uexZ6{8?KX8R%Ob-Q1s(3%@nfNh={XLoL z_$LQ3g8%N%{{$IG2a$LJLBKG^ul?P@1pmIC_jOD@nEb83cI@N6`gbjT8*}wf!~EO+ zCUSU~x%w9ZPxo*63zj$jcN@h2fciC%VF7?bBVI<4NZU)`%K;pq5l{!H22=r716BYE z09k-!zRT|AXp|H zdF6o30L)*^KEMgUX8`(n`CWiQKpkN6GpT_|4NPiaQUjA3_+PC7tQwLrpJ@|kB;JvD zXJTgJ#>58`cO?Ei@tMS5C+otLahG z^Cqw9J=4dg=%m7=^+~>@(WJ-B&zS#c9xz`t-<-TY`5%*CP98|Ul6*soEu}2w^Av6B z)YKoRKAHNDsV}8^Q~Oenq`s4SA@x$~m#H%>b1ZjS%$7}-PRluqY?*5Pjy1`eVO?Y` zuohX}*2k<*Sf8{0*7{G@9_tzFIqP}rU#*{8XQa(cD@$9Owl(d0X*<)NNqZ^n_i2aH z{*-nh&6!@EUZ4JW`jhG2^taQ)ZPB({Z7XaQw(r??*$&wLY#Xx8vfpk`wwKtq+1>WX z?XTNU*=J_V%`j&y&M3*aFXR43m;qf{KDTad}ASF#F+qe z7MXZ2wDoM_TZ!)^ew6r0;+Ki6Dath6ly1s1IZZ1~>r5L=^`;inBc_*32Tey!r%e}3 zu}KL@8^F~@?@TU9UX^@*@*k5=B%e;cIb~%^MT$Q)#xl#Yz>;lQYAJ>GeqwpX^19`y z<)Y;aOSm=4Ivtu^XmwZ%ttHlV)*o1ZV%=+fUeV)Wt1j*Ow42h5X>-yt({j^ZO#7#_ zchjV_FVYO@3)1cBOVZ2Jx21m{TKr}DOX+>-TAR^!yX`JpvdwC<+gvu$_6yr{wij&s zpwU-sUR$s2knK8qoIT!dv?tiR?2p-Bu>a2firs7PwV$;|Wn^UJX5?oSWH>WcWUS0s zov|+CR~av4?8`Wi@k++j%$UrZG7~cAWtub7GIKNW%cDe`oj}h&g)Kf0JA5~FY6sN9Ey)U&swK=sVwLNu5>JL-@0k-*k>Kmya zzyew8Y-=Jca53z!+L{&2cG{io@B(qByP zO@BB2({w#Fv)OhM7B*s&ZLD2u*V$9-tL(geyS>%kZtt}3uG?WT6q zUei8PuZc-vQ{pT}OM>MN%X~|sCD~%N*ezL>TuZ*Cz~Z#5u&lJKwyd*MS*k5{mPQL_ z*<#slX|=S&K6hAlT6S3;w>)8a%Cgt;wBq)q>AE1afHo3yo^bz+^mtdr|Fn^(s+wwt!JrMj_ClG{4I z=HBb39^1quB%Y9vkdVs5o+c0y(gYG9ct9WlL(^UW3Gv9JNr;ENQVGz+@4MIb{ga#P zlx$-Yi*#_~B$gJJcjO3dAwI~!k_`vRXSw;Fs&scNd;)(x?t^K7GnSttu9kx{%nIqsVRft}L;~N-gNv5ZT6EMORkpB4u}g#7^dD zczT_0_NdEx*)W9Gct&D_cjbBuH9U2r`Bl>VB9dKM*^o8k72m8P<(!h(OmI!ME{Tm( z1xeGG!pdz?H6-?V`;%>7(r(KMiAgMkvS6>(GdNN10%|w||lnJpIBgd4)+Zc2X2sX|p z*j{?Q&ISeB$0q5qpB@M3agZK|+>pP2;rd^%0`8PfLtAj46fFnfK|J7oAj}Si*`Zw` zex{HA>7tefza-W&_nIDuH`+Du{}|TOI~u~>qgryIy6aR2bimpIbqJUq=>T-p0w^KY z#HtBUz?Cq&mmd4*0lbd0{ceE9&K+B>!Ie=;_6I0DtFfqR8?xa6>9&jHc+pYD!cDMW ze)v_gGV|Q|>tCL}`SSGi%Xpnex=}lQ+#-KgBO zMCJHPsrZ+sZ_dunVhx?`Gtzduc0bxXUqnx?9{t{LuR|?~J9pjW=5!Q`_|Y(% z3bSKy@u|}Dx3c+#%vFi)bu1FSB{h}?l{4gqu}lOd!jAV_Wgo)lbV*Oo_Y5xPQqPwo zY#M&=N_L_0LWF^N3>Qn8bheCzCc;j_L8S}%+MN^f=t9iyds45u@x7J1nue9pkN|*cWzD8~w=lP5`WmR{rdBu!>%-X&|u! zB)WAbfXj8Jmc%}idB!;W8SzMvI&&EhnJaY&za#icj&B$#s^j%htjx5g(>hP&8e(R6-!7?bFfqdCo2wK`yRqu_Ppfros6`vt9YnwUdY8q_UJ5(4@9vo z+D#uYjfri0iAhYDv}7ETF_V~pMGH`AaFPk)BooA;CopRcqA<<(LnNuQ!)}0Q|MJc6 zyafqLvq-_sF1J>6FGs-^J`!fb*v|JQ(k_P`wUk-tJ+^~-ci-Dx_Gj)f(O9@ccW<1( zlTQ2tZh_LVPH$|pm#yobd5*2bWSH&8w!*VAMX>2j^q-_h9n8S7WnECKE!sbd8dkg= zY->MF6M4Ye(}s(w^rh7E*xeo>7;M|&y9WRbxihNrG$vOV;~c@<7#1e=r)6RIIvWzS zQ>DikJ;vz);vb_)7GwL|u=)C%f6M$EkfC%U7&c}IWT(g(u_7j)fyXa4vIRUm06b>5 ze`4|T`ae&+KLv(C>0}@L82MJc?g7vt%kLnZ(bolU!!TT)c{HzDwR~(&>(jtGjt0TY z?62M9tGhrsR{xMmbtyOz1u_zFSQMVv8k(>oX`ax8+fDuY&U=484v0~j35FRkMw_&c z7H2VnvRTb%Kyw6rrviZ1>99{a(hBb+|AnQNmfK!{)_++qYHCwxM*EUzd%y-JwKvT6 zfmIQu#p^F-a#}OJg=#GJP)u5AehIeiy@Uw|IK0^Xiovf+Z zXDlUcwZ%8&Hph8AZ|MSB6rHc)n461xRnauK(%@BfqghwvMpf`l#aK6M>gciT;nzA^ z)D;8g_*_PjW}B<4PEjr!4&&Diqj^4=+}zwu$fnT=T2ty)lk{XRo6h9RnK%r06uR7~ z3ti`$_)1IB(D0QumzyxHN=r1a%bOtBTwc=z@(h(s-_#TXhr(yLuC5xJvL>un*AyLx z#ValBSslICX%j~eI0aNRsKKXFWu7fh@r$W)wtU7?b0v$D(#sWoB~>b=@|A3+%nKzB z>@H;KKoq|gc`AR6UqWd83>WA-jFY&B5F1(nQx)o0QR{SKSy1;2-Zf(t67*YdiYo3W zRM9}|WSp<5cX3|;?c!LOHWZz1p6D>LW|>u2Hk8ioi><9QD~rc3(4CU`qYH&J?Qr=E zm8BdnUcQKa=Tq@y^2(FxWOAXhU}Zd+ILjB6hFni3Gx;eLohRU4m|szAZN9QrRqLwu z?9}GEVhGB`s&-eY39_hn4TMu`YO*0?R1C3(VQF*RimBc~D`3)ml5|~|PnwG9wu=;+ z+(UfQ|Jsh3fm5ybQ}oumnPXkzv5Wd$;FxxBYxYXmU-0!lDrGYA^m=xhQ zs03ZUvHqyU-|iqd5q>yL_pWw?tH9^6&?T+Xq}FZh;sjFDTH=avzjiQBrq z*3o6J)y{VKUEZ|GzpZ%%h)yviIE9RvbYLwvS@_RV-i}*kKLDKT3$($n)gDf zqPF5HtEi|fQrKnPJqRiu#h%pG|6=9FK{-END;@){L?R$AmlX7s~ z_3ZYXd3||v=gys(Z|=Qw@7QXF#cL4#yRzf?8Ny5Gk%Zz=o!M#BS*+EDa|aQ!^^D8GxZfXNkS~8*ZlhzrnmTI%ZsjsW9V|;82;dosG32?06Hxpl?FV$*{KG_#z2jgBw zFnoi`>9pDuAPi4Dy2>s}KTTiSTslSPD*YKQbOe34j&%q8To=cab`D#7Zhetfqt!^V zomn0}jChdEA80iUPN5A^us)u6y=+?)(hMc3m+^(MZV&H#d_;Q2=kxOn4->*g>1#x& zZ5!cT0fr5ubt~3t%mCU!`T+S}XnJi{l?owR^fBeLc!-Z@TUZj%yS)s@9Xz-DkI?86 zq*Wu08YQbyiVA5Q{$RjOs#z~lp;TFuHf9B*LSyYg;L%Pjz7;ITy1c|FO@Inbs-?@* zKl#FphDp!xJPG(_sZhcS#v6nlrY-5XigKP0Me5AKGXehUh*dUPQ>;RT(R-43sZbj2 zz#s@y?`k7%UWG1}K1uQ!q_Ip?Ar*>)G7KgN!5f8M97;gL;eRrGS3^nUP?8LaupWPy zy8X`k;t-;x1Sq4+SPOs)GOa|h8W*Wijv9?oqp{L7Wfm6IN+LV>0PAaoS&Y6KdBSQ) zn3G1z8LWPv)yn~k;T-|e!md=IbZPWeq=gB3VVYo&!?|FKP#*>iZNKbPDiz8J!J;7o zD6mX&Nd$wP@Dz@IiiU|XNNj#D>+S-=1XHci;ZUJ*ksCOfKr7*aE-!Mu*-P4?Q)gEP zp+g5fH?JP{PC~WCTnqn`Y(~2gKAP<+G@`cNWUOs&FxoA~%33q*1*6qk?=(6s_10!* zlMTL19NO|;H~@#ms{nurbTt4}!v**u_?8IY;!qNN8^$4xqB42VN@$Y;ZQ_s?QN?6{ zw^ZO6Pf!|4M;Y{WF-jn4B+8_ZQS>pIKC3W7mjLG7^?e}YCH$97C{{c zm`)A>G(`j`MXZ2T0iXa^irEbM7)c+1*EBRL9H83i`3)XWWwaP#0~9nXU+oXHGrR(% zgBr;+o2-q9o9KG^{H>(3uwv%o%L|sSDkxY5uLV$+cqT8IP*g!HborBUX-Q$((qiE^ z)QJD}eQ%3-=TecB(OqfOEh<=AR8#~uv?#_(OXIrm)gHPLoz#-M?OCw9v`jmn1?$_p z;m*xu4H)rUHOfXbw>CCD>}T4^|5?8_$`G+4M1x0d%(#`tz~`08fNLzd7_cK!P&Ud@q0%AaEyOq?>@*VkpPLc8Cz$a#!BWS;??m`Y6<-n* z4F|7dz%o;tPVGFk&k+bl$Ouv+5v0io(jyUM$OuM8BFK~xj2cLgjYi7|vIY`>rlkuG zgQABS1N^675{h>r)x*NT#=?`jF$iU$i{MGMI}o68h@P^*J%?u;!r_Yinq%w!+zVa? zEyX|(9ZaHmSLpC@qF=2>7r|EPb9@K!tCsGfx6hD+f6^fHm2UT(lOBz!7WJxO0D3SfEP``l?I3+|qlpM+l2e{?UTQ)oo6tomUi9T#c(8Vcz6ga{ss!) z65-IRkG)BAWuAfT$Xexh2kH5dc);Qf;aK}q+Q{+ZnO1Exnre)5;dDEW!eGz|zi

rc%>(qc56(32{Cq|!$keSqVyrJGEPMux-Y`iD-KzXiz9 zGBG-Agb>J3k&`S&O#Tm^NU@Ot;K5PABTV~$Eq=CqGx6g*@GxkZ6azoJHR$y!0F*82 z9SCQ{RKbII7-5<@#p)M(`O%ctPr>WRjRr4azAhYJeFjQq{o@2zmj)*^fDAn-EE=8| z7@80xX^PMURZ}#%l8DYgq?p1Cl&k==!ssvqjL}1yh_heZUQ-`;Nm}>zCmYhzGn>`# zzdz@TXAV5NT~jlmspnLNetd1yN87eO*0QVSndZ|+Q$L-Xv;CLpBQ~!*SvK=;Wi!9~ z=G@ou-Lqx{kG|03R$CL-H`ccNdd}Go|I)m36j$JQc zlALol=?tfPyT?vAT)Fjh>XcXQRm69) z+wm7Sm*0AJVX*XzRj$Gd75}*Gds4kR_v%k)ue#sr>U{c7WlZHgix)V~ zbT-Ft+Wg@A|GaMQ<8R;mwsBg`sk9~6s_N7C-myM${oQLXPk73u8F9mk!zFV@wcWdC z&BwogFyH>(PPO*UT^~OB<)*`rytnTr)8r!+;TEI*kl`%YB5IHNBbbrxo-N?-AOXIs zhIA=*J-8YfYBUnu4u~8F2q)xFDuX@`J!}thzzEytaAcNv|7d&tKkJ}G4YvzX$e7FU z!)oOisDJ?D4!DBj}Pxwk9V~9C@K=0QJlp=X8 z>n1*qcrd_>1TarCuVMl=R8xXOxmr9$Uy2JUL0+gTuV|LYq{|<~?MxSjEG73GQV1WkOFOKB7FhDa6I^;vu_<8EDech5apZQq1r& z;g|7z$4rBvv$Ipr2twp*Z>qXj-M;W!*1R|MGr4BXX)nGO)m zP4y%8GM(UdV5T)dppN%b(K`by52>;e%=ugRP9{LaQF~YpQfRIqc=EE@3ylfG49E%m zFd!e!Gdi%vk%udd4vV8iWYcJY{Lum@ZZz8MMyu0ecHnwDhHzb#g{Fz%S2Z?Tn{W*T z97`~Pxr22gDP^(|$Mc+Zwb-_x66PJ}=?sR( zsV0M=%2_2=Ow~`p)vS;48VqJ@9yBeZz%4Ix`8{3O)#~v%ZHJ8Iy1mx@rD+E$vX0ED`Q5%}yT8tV{q{9ajGVtZyZi2E2@`mxDDc6N!Yhi8 zzmdHXjn^E*#+*Fn#m-6B?)~KD-M786s}nWO_@eZ)ou3@*W;SlzeduI$u`8Rq-@A1I z*R(v2D*g zH-0;9)6})soyDmhPCdEp(0A8)7isR>QSsHm@0-&1d)}#-pM0=nzvaXWU%tC7 zC1rN!^ut@mPuuIhc-UQrw|AWQe8X$Il1yuNzP90&lj#TEY~TNGmaRq=mpP33Es?K> z2o;b$`PfL``fq@Umqnzek*c%?1+ZyiKyN-uqgf3ztW>+q&@hlO_?;Sz|{zA9pS8S2A%DQ>gS+^fW^JH$&e zdGc{Yx+EgCePBS_L1l<=X{1kztvw&a9FKIZLfm0;8L3;VyZ|Bb=D{e2Et4?Uayk2w zvynL~^UM?dORdahNz9*stvF=nQ3s%mi%WgH z3J{ClhdfHIoET*|QsVnadMv)O;G~kRGOj1F-3PmqiYsjaIXr0OPRQ&j87d<_62miK zLZUE~#ebAMl~DkR=X8kSM&l`q2?$Ju3w4ptd?Hf}|F+~rWg2z@REnxRzDS}LL7HW7 zQRN4Y0rMKkos}2|#zkW+cW#waptR&7PYnNFg2&*(TEpzRttNrG>JU&LjSj)vxIFsn EUlO!`1ONa4 literal 0 HcmV?d00001 diff --git a/updater/testData/lib/boot.jar b/updater/testData/lib/boot.jar new file mode 100644 index 0000000000000000000000000000000000000000..98b408f647d4d4b8c76e0af80684d285a6bdf5bf GIT binary patch literal 13161 zcmd^FX>=Rcb-sgbfZulqieVZgI6>Zn8*G)@B(5h9V>oV6jM|8#zkq zI&N#bwcXgY?AVIqm`-ZfODsx>QafEzwQky;)8F~kKk3OiIVUH7;-;?D@4gve1|US) zlz;S`ioz^!-o5X>`|i8%yZ5~V19pc({O{?R8{5T$aq*CYhWf_3T0_JA?KeLmI*_mW z6slgR`o^WxsLH=8{PIJd3pR{q6TzWaB$Z6hrZd`fIv7es z+8WE1a>bM_TGS1nRkpO2Iva~<>2|aJr)LVg?LhrVa(a;(>gpAB296t%*pBB~U1 zgth+tU!LuM2H*MDiC^9#@>*xgwnQx1X2{Z(o{6>f=yDxMCC|p9T54U;_!wlRC8An1 zIGIcZwP-98OPmUtx(H6j;#xX*E|!@JCc>H6S*;_Sj>KZYWTG`QrL|7RXUi2Rzb&Wy zHkP@~WRRC)Sf}n{>LO_@b^=YDyYP$Z-+GAnw--HJIJ74BcB32ZCAham;^B1qlbb*K z2uwO?N}(0h>!v=1`sseY?B|k@Ob^I3;HE(j`DsYOWthuHWICXbN)O6(P@!dfA63Xp zV|+QpmvQECSf+=V=7>y3B`Tku?GC3kqk9sq92CQd!N?10eA^{a*>KlT-^l|9`}#u< zN#xV3iV+{pq%aDoQr?qHq%+|}W;`6vY7+T-`}(^M4UV1c8}1qD4GrIal6gqv+8s;8 zGJ8>>VIiBwafuu~$tdV624e|rI6FO|rN+V&ag_K5laX+IJe-R0yHP0NL)${pL-DwF zDjYX@FdUxN`p!qRnGAdmWGz8(D3Q+2%p_CrGX{~Bz>%4Xr6t-qxYPk=1x3P%WFm$x zusG=8gsFbLq|8!+`lFd}6v(VR;R9NXk4gJiQJK7 zA`^}!Ab!1}@ls>l2$QfyP)SK>=X$jW#vmopx*X3EBt|9lj7jz3&@K*-|NO$Z#DxN!#s7N^}+?ltpyEq?0S7$!sd3^~2>z zRAZIQFrPM_PAaXU;}Us?yT(G}eJ968PIisd&om;m=Od>3r;wzER0z~WcB zv#~e~ksFv$DMC?|G}@}tB%P9I`%=YbcB?UJ3lwe)9R{pe5Q!Q}*vqknCdMAj71t7{ zGE)-S8yZ6rdD7X5v~ZK`^g<

7ItAyB2N|Epfx)nHj8*61A2Pc451Qc46D@Oj38` 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 JcZS0s`d>gDUGV?_ literal 0 HcmV?d00001 diff --git a/updater/testData/lib/boot2.jar b/updater/testData/lib/boot2.jar new file mode 100644 index 0000000000000000000000000000000000000000..5c9c316cfdb409b7955d18c4f33d97d2ca011305 GIT binary patch literal 13324 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 M-*AXm!AFAhzdhw?&Hw-a literal 0 HcmV?d00001 diff --git a/updater/testData/lib/boot2_changed_with_unchanged_content.jar b/updater/testData/lib/boot2_changed_with_unchanged_content.jar new file mode 100644 index 0000000000000000000000000000000000000000..c8eb3d991c53427a64ec2d7a2e6aade7bb390602 GIT binary patch literal 13324 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 L4)H4ZNRa*)oAzq_ literal 0 HcmV?d00001 diff --git a/updater/testData/lib/boot_with_directory_becomes_file.jar b/updater/testData/lib/boot_with_directory_becomes_file.jar new file mode 100644 index 0000000000000000000000000000000000000000..4c16379df56924577efcc87b5e7d1cf3482d64f9 GIT binary patch literal 7368 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 Y#t!QT5BLE7@y!bS>%@%Jc98G>7mA(c3jhEB literal 0 HcmV?d00001 diff --git a/updater/testSrc/com/intellij/updater/DigesterTest.java b/updater/testSrc/com/intellij/updater/DigesterTest.java new file mode 100644 index 000000000000..a71041c48f26 --- /dev/null +++ b/updater/testSrc/com/intellij/updater/DigesterTest.java @@ -0,0 +1,21 @@ +package com.intellij.updater; + +import org.junit.Test; + +import java.util.Collections; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class DigesterTest extends UpdaterTestCase { + @Test + public void testBasics() throws Exception { + Map checkSums = Digester.digestFiles(getDataDir(), Collections.emptyList(), TEST_UI); + assertEquals(12, checkSums.size()); + + assertEquals(CHECKSUMS.README_TXT, (long)checkSums.get("Readme.txt")); + assertEquals(CHECKSUMS.FOCUSKILLER_DLL, (long)checkSums.get("bin/focuskiller.dll")); + assertEquals(CHECKSUMS.BOOTSTRAP_JAR, (long)checkSums.get("lib/bootstrap.jar")); + Runner.initLogger(); + } +} \ No newline at end of file diff --git a/updater/testSrc/com/intellij/updater/PatchFileCreatorTest.java b/updater/testSrc/com/intellij/updater/PatchFileCreatorTest.java new file mode 100644 index 000000000000..4e87db2a8eb0 --- /dev/null +++ b/updater/testSrc/com/intellij/updater/PatchFileCreatorTest.java @@ -0,0 +1,333 @@ +package com.intellij.updater; + +import com.intellij.openapi.util.io.FileUtil; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; +import java.util.*; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; + +import static org.junit.Assert.*; + +@SuppressWarnings("ResultOfMethodCallIgnored") +public class PatchFileCreatorTest extends PatchTestCase { + private File myFile; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + myFile = getTempFile("patch.zip"); + } + + @Test + public void testCreatingAndApplying() throws Exception { + createPatch(); + + assertAppliedAndRevertedCorrectly(PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI)); + } + + @Test + public void failOnEmptySourceJar() throws Exception { + final File sourceJar = new File(myOlderDir, "lib/empty.jar"); + if (sourceJar.exists()) sourceJar.delete(); + assertTrue(sourceJar.createNewFile()); + + try { + final File targetJar = new File(myNewerDir, "lib/empty.jar"); + FileUtil.copy(new File(myNewerDir, "lib/annotations.jar"), targetJar); + + try { + createPatch(); + fail("Should have failed to create a patch from empty .jar"); + } + catch (IOException e) { + final String reason = e.getMessage(); + assertEquals("Corrupted source file: " + sourceJar, reason); + } + finally { + targetJar.delete(); + } + } + finally { + sourceJar.delete(); + } + } + + @Test + public void failOnEmptyTargetJar() throws Exception { + final File sourceJar = new File(myOlderDir, "lib/empty.jar"); + FileUtil.copy(new File(myOlderDir, "lib/annotations.jar"), sourceJar); + + try { + final File targetJar = new File(myNewerDir, "lib/empty.jar"); + if (targetJar.exists()) targetJar.delete(); + assertTrue(targetJar.createNewFile()); + + try { + createPatch(); + fail("Should have failed to create a patch against empty .jar"); + } + catch (IOException e) { + final String reason = e.getMessage(); + assertEquals("Corrupted target file: " + targetJar, reason); + } + finally { + targetJar.delete(); + } + } + finally { + sourceJar.delete(); + } + } + + @Test + public void testReverting() throws Exception { + createPatch(); + + PatchFileCreator.PreparationResult preparationResult = PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI); + preparationResult.patch.getActions().add(new MyFailOnApplyPatchAction()); + assertNothingHasChanged(preparationResult, new HashMap()); + } + + @Test + public void testApplyingWithAbsentFileToDelete() throws Exception { + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + + new File(myOlderDir, "bin/idea.bat").delete(); + + assertAppliedAndRevertedCorrectly(PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI)); + } + + @Test + public void testApplyingWithAbsentOptionalFile() throws Exception { + FileUtil.writeToFile(new File(myNewerDir, "bin/idea.bat"), "new content".getBytes()); + + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.singletonList("bin/idea.bat"), TEST_UI); + + new File(myOlderDir, "bin/idea.bat").delete(); + + PatchFileCreator.PreparationResult preparationResult = PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI); + assertTrue(preparationResult.validationResults.isEmpty()); + assertAppliedAndRevertedCorrectly(preparationResult); + } + + @Test + public void testRevertingWithAbsentFileToDelete() throws Exception { + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + + new File(myOlderDir, "bin/idea.bat").delete(); + + PatchFileCreator.PreparationResult preparationResult = PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI); + preparationResult.patch.getActions().add(new MyFailOnApplyPatchAction()); + assertNothingHasChanged(preparationResult, new HashMap()); + } + + @Test + public void testApplyingWithoutCriticalFiles() throws Exception { + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + PatchFileCreator.PreparationResult preparationResult = PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI); + + assertTrue(PatchFileCreator.apply(preparationResult, new HashMap(), TEST_UI)); + } + + @Test + public void testApplyingWithCriticalFiles() throws Exception { + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Arrays.asList("lib/annotations.jar"), + Collections.emptyList(), TEST_UI); + + PatchFileCreator.PreparationResult preparationResult = PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI); + + assertTrue(PatchFileCreator.apply(preparationResult, new HashMap(), TEST_UI)); + assertAppliedCorrectly(); + } + + @Test + public void testApplyingWithCaseChangedNames() throws Exception { + FileUtil.rename(new File(myOlderDir, "Readme.txt"), + new File(myOlderDir, "README.txt")); + + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + + assertAppliedAndRevertedCorrectly(PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI)); + } + + @Test + public void testCreatingAndApplyingWhenDirectoryBecomesFile() throws Exception { + File file = new File(myOlderDir, "Readme.txt"); + file.delete(); + file.mkdirs(); + + new File(file, "subFile.txt").createNewFile(); + new File(file, "subDir").mkdir(); + new File(file, "subDir/subFile.txt").createNewFile(); + + FileUtil.copy(new File(myOlderDir, "lib/boot.jar"), + new File(myOlderDir, "lib/boot_with_directory_becomes_file.jar")); + + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + + assertAppliedAndRevertedCorrectly(PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI)); + } + + @Test + public void testCreatingAndApplyingWhenFileBecomesDirectory() throws Exception { + File file = new File(myOlderDir, "bin"); + assertTrue(FileUtil.delete(file)); + file.createNewFile(); + + FileUtil.copy(new File(myOlderDir, "lib/boot_with_directory_becomes_file.jar"), + new File(myOlderDir, "lib/boot.jar")); + + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + + assertAppliedAndRevertedCorrectly(PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI)); + } + + @Test + public void testConsideringOptions() throws Exception { + createPatch(); + + PatchFileCreator.PreparationResult preparationResult = PatchFileCreator.prepareAndValidate(myFile, myOlderDir, TEST_UI); + Map options = new HashMap(); + for (PatchAction each : preparationResult.patch.getActions()) { + options.put(each.getPath(), ValidationResult.Option.IGNORE); + } + + assertNothingHasChanged(preparationResult, options); + } + + private void createPatch() throws IOException, OperationCancelledException { + PatchFileCreator.create(myOlderDir, myNewerDir, myFile, + Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), TEST_UI); + assertTrue(myFile.exists()); + } + + private void assertNothingHasChanged(PatchFileCreator.PreparationResult preparationResult, Map options) + throws Exception { + Map before = Digester.digestFiles(myOlderDir, Collections.emptyList(), TEST_UI); + PatchFileCreator.apply(preparationResult, options, TEST_UI); + Map after = Digester.digestFiles(myOlderDir, Collections.emptyList(), TEST_UI); + + DiffCalculator.Result diff = DiffCalculator.calculate(before, after); + assertTrue(diff.filesToCreate.isEmpty()); + assertTrue(diff.filesToDelete.isEmpty()); + assertTrue(diff.filesToUpdate.isEmpty()); + } + + private void assertAppliedAndRevertedCorrectly(PatchFileCreator.PreparationResult preparationResult) + throws IOException, OperationCancelledException { + + Map original = Digester.digestFiles(myOlderDir, Collections.emptyList(), TEST_UI); + + File backup = getTempFile("backup"); + + for (ValidationResult each : preparationResult.validationResults) { + assertTrue(each.toString(), each.kind != ValidationResult.Kind.ERROR); + } + + List appliedActions = + PatchFileCreator.apply(preparationResult, new HashMap(), backup, TEST_UI).appliedActions; + assertAppliedCorrectly(); + + assertFalse(original.equals(Digester.digestFiles(myOlderDir, Collections.emptyList(), TEST_UI))); + + PatchFileCreator.revert(preparationResult, appliedActions, backup, TEST_UI); + + assertEquals(original, Digester.digestFiles(myOlderDir, Collections.emptyList(), TEST_UI)); + } + + protected void assertAppliedCorrectly() throws IOException { + File newFile = new File(myOlderDir, "newDir/newFile.txt"); + assertTrue(newFile.exists()); + assertEquals("hello", FileUtil.loadFile(newFile)); + + File changedFile = new File(myOlderDir, "Readme.txt"); + assertTrue(changedFile.exists()); + assertEquals("hello", FileUtil.loadFile(changedFile)); + + assertFalse(new File(myOlderDir, "bin/idea.bat").exists()); + + // do not remove unchanged + checkZipEntry("lib/annotations.jar", "org/jetbrains/annotations/Nls.class", 502); + // add new + checkZipEntry("lib/annotations.jar", "org/jetbrains/annotations/NewClass.class", 453); + // update changed + checkZipEntry("lib/annotations.jar", "org/jetbrains/annotations/Nullable.class", 546); + // remove obsolete + checkNoZipEntry("lib/annotations.jar", "org/jetbrains/annotations/TestOnly.class"); + + // test for archives with only deleted files + checkNoZipEntry("lib/bootstrap.jar", "com/intellij/ide/ClassloaderUtil.class"); + + // packing directories too + checkZipEntry("lib/annotations.jar", "org/", 0); + checkZipEntry("lib/annotations.jar", "org/jetbrains/", 0); + checkZipEntry("lib/annotations.jar", "org/jetbrains/annotations/", 0); + checkZipEntry("lib/bootstrap.jar", "com/", 0); + checkZipEntry("lib/bootstrap.jar", "com/intellij/", 0); + checkZipEntry("lib/bootstrap.jar", "com/intellij/ide/", 0); + } + + private void checkZipEntry(String jar, String entryName, int expectedSize) throws IOException { + ZipFile zipFile = new ZipFile(new File(myOlderDir, jar)); + try { + ZipEntry entry = zipFile.getEntry(entryName); + assertNotNull(entry); + assertEquals(expectedSize, entry.getSize()); + } + finally { + zipFile.close(); + } + } + + private void checkNoZipEntry(String jar, String entryName) throws IOException { + ZipFile zipFile = new ZipFile(new File(myOlderDir, jar)); + try { + assertNull(zipFile.getEntry(entryName)); + } + finally { + zipFile.close(); + } + } + + private static class MyFailOnApplyPatchAction extends PatchAction { + public MyFailOnApplyPatchAction() { + super("_dummy_file_", -1); + } + + @Override + protected void doBuildPatchFile(File olderFile, File newerFile, ZipOutputStream patchOutput) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + protected ValidationResult doValidate(File toFile) throws IOException { + throw new UnsupportedOperationException(); + } + + @Override + protected void doApply(ZipFile patchFile, File toFile) throws IOException { + throw new IOException("dummy exception"); + } + + @Override + protected void doBackup(File toFile, File backupFile) throws IOException { + } + + @Override + protected void doRevert(File toFile, File backupFile) throws IOException { + } + } +} diff --git a/updater/testSrc/com/intellij/updater/PatchTest.java b/updater/testSrc/com/intellij/updater/PatchTest.java new file mode 100644 index 000000000000..14ff6c0abb18 --- /dev/null +++ b/updater/testSrc/com/intellij/updater/PatchTest.java @@ -0,0 +1,192 @@ +package com.intellij.updater; + +import com.intellij.openapi.util.io.FileUtil; +import org.junit.Before; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.nio.channels.FileLock; +import java.util.*; + +import static org.junit.Assert.assertEquals; + +@SuppressWarnings("ResultOfMethodCallIgnored") +public class PatchTest extends PatchTestCase { + private Patch myPatch; + + @Override + @Before + public void setUp() throws Exception { + super.setUp(); + myPatch = new Patch(myOlderDir, myNewerDir, Collections.emptyList(), Collections.emptyList(), + Collections.emptyList(), TEST_UI); + } + + @Test + public void testBasics() throws Exception { + List expectedActions = Arrays.asList( + new CreateAction("newDir/newFile.txt"), + new UpdateAction("Readme.txt", CHECKSUMS.README_TXT), + new UpdateZipAction("lib/annotations.jar", + Arrays.asList("org/jetbrains/annotations/NewClass.class"), + Arrays.asList("org/jetbrains/annotations/Nullable.class"), + Arrays.asList("org/jetbrains/annotations/TestOnly.class"), + CHECKSUMS.ANNOTATIONS_JAR), + new UpdateZipAction("lib/bootstrap.jar", + Collections.emptyList(), + Collections.emptyList(), + Arrays.asList("com/intellij/ide/ClassloaderUtil.class"), + CHECKSUMS.BOOTSTRAP_JAR), + new DeleteAction("bin/idea.bat", CHECKSUMS.IDEA_BAT)); + List actualActions = new ArrayList(myPatch.getActions()); + Collections.sort(expectedActions, COMPARATOR); + Collections.sort(actualActions, COMPARATOR); + assertEquals(expectedActions, actualActions); + } + + @Test + public void testCreatingWithIgnoredFiles() throws Exception { + myPatch = new Patch(myOlderDir, + myNewerDir, + Arrays.asList("Readme.txt", "bin/idea.bat"), + Collections.emptyList(), + Collections.emptyList(), + TEST_UI); + + List expectedActions = Arrays.asList( + new CreateAction("newDir/newFile.txt"), + new UpdateZipAction("lib/annotations.jar", + Arrays.asList("org/jetbrains/annotations/NewClass.class"), + Arrays.asList("org/jetbrains/annotations/Nullable.class"), + Arrays.asList("org/jetbrains/annotations/TestOnly.class"), + CHECKSUMS.ANNOTATIONS_JAR), + new UpdateZipAction("lib/bootstrap.jar", + Collections.emptyList(), + Collections.emptyList(), + Arrays.asList("com/intellij/ide/ClassloaderUtil.class"), + CHECKSUMS.BOOTSTRAP_JAR)); + List actualActions = new ArrayList(myPatch.getActions()); + Collections.sort(expectedActions, COMPARATOR); + Collections.sort(actualActions, COMPARATOR); + assertEquals(expectedActions, actualActions); + } + + @Test + public void testValidation() throws Exception { + FileUtil.writeToFile(new File(myOlderDir, "bin/idea.bat"), "changed".getBytes()); + new File(myOlderDir, "extraDir").mkdirs(); + new File(myOlderDir, "extraDir/extraFile.txt").createNewFile(); + new File(myOlderDir, "newDir").mkdirs(); + new File(myOlderDir, "newDir/newFile.txt").createNewFile(); + FileUtil.writeToFile(new File(myOlderDir, "Readme.txt"), "changed".getBytes()); + FileUtil.writeToFile(new File(myOlderDir, "lib/annotations.jar"), "changed".getBytes()); + FileUtil.delete(new File(myOlderDir, "lib/bootstrap.jar")); + + assertEquals( + new HashSet(Arrays.asList( + new ValidationResult(ValidationResult.Kind.CONFLICT, + "newDir/newFile.txt", + ValidationResult.Action.CREATE, + ValidationResult.ALREADY_EXISTS_MESSAGE, + ValidationResult.Option.REPLACE, ValidationResult.Option.KEEP), + new ValidationResult(ValidationResult.Kind.ERROR, + "Readme.txt", + ValidationResult.Action.UPDATE, + ValidationResult.MODIFIED_MESSAGE, + ValidationResult.Option.IGNORE), + new ValidationResult(ValidationResult.Kind.ERROR, + "lib/annotations.jar", + ValidationResult.Action.UPDATE, + ValidationResult.MODIFIED_MESSAGE, + ValidationResult.Option.IGNORE), + new ValidationResult(ValidationResult.Kind.ERROR, + "lib/bootstrap.jar", + ValidationResult.Action.UPDATE, + ValidationResult.ABSENT_MESSAGE, + ValidationResult.Option.IGNORE), + new ValidationResult(ValidationResult.Kind.CONFLICT, + "bin/idea.bat", + ValidationResult.Action.DELETE, + ValidationResult.MODIFIED_MESSAGE, + ValidationResult.Option.DELETE, ValidationResult.Option.KEEP))), + new HashSet(myPatch.validate(myOlderDir, TEST_UI))); + } + + @Test + public void testValidationWithOptionalFiles() throws Exception { + FileUtil.writeToFile(new File(myOlderDir, "lib/annotations.jar"), "changed".getBytes()); + assertEquals(new HashSet(Arrays.asList( + new ValidationResult(ValidationResult.Kind.ERROR, + "lib/annotations.jar", + ValidationResult.Action.UPDATE, + ValidationResult.MODIFIED_MESSAGE, + ValidationResult.Option.IGNORE))), + new HashSet(myPatch.validate(myOlderDir, TEST_UI))); + + myPatch = new Patch(myOlderDir, myNewerDir, Collections.emptyList(), Collections.emptyList(), + Arrays.asList("lib/annotations.jar"), TEST_UI); + FileUtil.delete(new File(myOlderDir, "lib/annotations.jar")); + assertEquals(Collections.emptyList(), + myPatch.validate(myOlderDir, TEST_UI)); + } + + @Test + public void testValidatingNonAccessibleFiles() throws Exception { + File f = new File(myOlderDir, "Readme.txt"); + FileOutputStream s = new FileOutputStream(f, true); + try { + FileLock lock = s.getChannel().lock(); + try { + List result = myPatch.validate(myOlderDir, TEST_UI); + assertEquals( + new HashSet(Arrays.asList( + new ValidationResult(ValidationResult.Kind.ERROR, + "Readme.txt", + ValidationResult.Action.UPDATE, + ValidationResult.ACCESS_DENIED_MESSAGE, + ValidationResult.Option.IGNORE))), + new HashSet(result)); + } + finally { + lock.release(); + } + } + finally { + s.close(); + } + } + + @Test + public void testSaveLoad() throws Exception { + File f = getTempFile("file"); + try { + FileOutputStream out = new FileOutputStream(f); + try { + myPatch.write(out); + } + finally { + out.close(); + } + + FileInputStream in = new FileInputStream(f); + try { + assertEquals(myPatch.getActions(), new Patch(in).getActions()); + } + finally { + in.close(); + } + } + finally { + f.delete(); + } + } + + private static final Comparator COMPARATOR = new Comparator() { + @Override + public int compare(PatchAction o1, PatchAction o2) { + return o1.toString().compareTo(o2.toString()); + } + }; +} diff --git a/updater/testSrc/com/intellij/updater/PatchTestCase.java b/updater/testSrc/com/intellij/updater/PatchTestCase.java new file mode 100644 index 000000000000..417c32eb396c --- /dev/null +++ b/updater/testSrc/com/intellij/updater/PatchTestCase.java @@ -0,0 +1,41 @@ +package com.intellij.updater; + +import com.intellij.openapi.util.io.FileUtil; + +import java.io.File; + +@SuppressWarnings("ResultOfMethodCallIgnored") +public abstract class PatchTestCase extends UpdaterTestCase { + protected File myNewerDir; + protected File myOlderDir; + + @Override + public void setUp() throws Exception { + super.setUp(); + myOlderDir = getDataDir(); + myNewerDir = getTempFile("newDir"); + FileUtil.copyDir(myOlderDir, myNewerDir); + + FileUtil.delete(new File(myNewerDir, "bin/idea.bat")); + FileUtil.writeToFile(new File(myNewerDir, "Readme.txt"), "hello".getBytes()); + File newFile = new File(myNewerDir, "newDir/newFile.txt"); + newFile.getParentFile().mkdirs(); + newFile.createNewFile(); + FileUtil.writeToFile(newFile, "hello".getBytes()); + + FileUtil.delete(new File(myOlderDir, "lib/annotations_changed.jar")); + FileUtil.delete(new File(myNewerDir, "lib/annotations.jar")); + FileUtil.rename(new File(myNewerDir, "lib/annotations_changed.jar"), + new File(myNewerDir, "lib/annotations.jar")); + + FileUtil.delete(new File(myOlderDir, "lib/bootstrap_deleted.jar")); + FileUtil.delete(new File(myNewerDir, "lib/bootstrap.jar")); + FileUtil.rename(new File(myNewerDir, "lib/bootstrap_deleted.jar"), + new File(myNewerDir, "lib/bootstrap.jar")); + + FileUtil.delete(new File(myOlderDir, "lib/boot2_changed_with_unchanged_content.jar")); + FileUtil.delete(new File(myNewerDir, "lib/boot2.jar")); + FileUtil.rename(new File(myNewerDir, "lib/boot2_changed_with_unchanged_content.jar"), + new File(myNewerDir, "lib/boot2.jar")); + } +} \ No newline at end of file diff --git a/updater/testSrc/com/intellij/updater/RunnerTest.java b/updater/testSrc/com/intellij/updater/RunnerTest.java new file mode 100644 index 000000000000..22464a0fa053 --- /dev/null +++ b/updater/testSrc/com/intellij/updater/RunnerTest.java @@ -0,0 +1,25 @@ +package com.intellij.updater; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; + +import static org.junit.Assert.assertEquals; + +public class RunnerTest extends UpdaterTestCase { + @Test + public void testExtractingFiles() throws Exception { + String[] args = {"bar", "ignored=xxx;yyy;zzz/zzz", "critical=", "ignored=aaa", "baz", "critical=ccc"}; + Runner.initLogger(); + + assertEquals(Arrays.asList("xxx", "yyy", "zzz/zzz", "aaa"), + Runner.extractFiles(args, "ignored")); + + assertEquals(Arrays.asList("ccc"), + Runner.extractFiles(args, "critical")); + + assertEquals(Collections.emptyList(), + Runner.extractFiles(args, "unknown")); + } +} diff --git a/updater/testSrc/com/intellij/updater/UpdaterTestCase.java b/updater/testSrc/com/intellij/updater/UpdaterTestCase.java new file mode 100644 index 000000000000..9bde5c848507 --- /dev/null +++ b/updater/testSrc/com/intellij/updater/UpdaterTestCase.java @@ -0,0 +1,72 @@ +package com.intellij.updater; + +import com.intellij.openapi.application.ex.PathManagerEx; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; +import com.intellij.testFramework.fixtures.TempDirTestFixture; +import org.junit.After; +import org.junit.Before; + +import java.io.File; + +public abstract class UpdaterTestCase { + protected static final UpdaterUI TEST_UI = new ConsoleUpdaterUI(){ + @Override + public void startProcess(String title) { + } + + @Override + public void setStatus(String status) { + } + }; + + protected CheckSums CHECKSUMS; + private TempDirTestFixture myTempDirFixture; + + @Before + public void setUp() throws Exception { + myTempDirFixture = IdeaTestFixtureFactory.getFixtureFactory().createTempDirTestFixture(); + myTempDirFixture.setUp(); + + FileUtil.copyDir(PathManagerEx.findFileUnderCommunityHome("updater/testData"), getDataDir()); + + boolean windowsLineEnds = new File(getDataDir(), "Readme.txt").length() == 7132; + CHECKSUMS = new CheckSums(windowsLineEnds); + } + + @After + public void tearDown() throws Exception { + myTempDirFixture.tearDown(); + Utils.cleanup(); + } + + public File getDataDir() { + return getTempFile("data"); + } + + public File getTempFile(String fileName) { + return new File(myTempDirFixture.getTempDirPath(), fileName); + } + + protected static class CheckSums { + public final long README_TXT; + public final long IDEA_BAT; + public final long ANNOTATIONS_JAR; + public final long BOOTSTRAP_JAR; + public final long FOCUSKILLER_DLL; + + public CheckSums(boolean windowsLineEnds) { + if (windowsLineEnds) { + README_TXT = 1272723667L; + IDEA_BAT = 3088608749L; + } + else { + README_TXT = 7256327L; + IDEA_BAT = 1493936069L; + } + ANNOTATIONS_JAR = 2119442657L; + BOOTSTRAP_JAR = 2082851308L; + FOCUSKILLER_DLL = 1991212227L; + } + } +} \ No newline at end of file diff --git a/updater/updater.iml b/updater/updater.iml index a002577c561e..e55b58d17cd0 100644 --- a/updater/updater.iml +++ b/updater/updater.iml @@ -4,10 +4,13 @@ + + +