From 68dbc545a6a3a60bf86b69499a6b4b406f861ca2 Mon Sep 17 00:00:00 2001 From: Joe Hu Date: Tue, 10 Dec 2024 08:10:31 -0500 Subject: [PATCH] Fix #19 - RDB compatibility with ReJSON and add compatibility test (#21) Signed-off-by: Joe Hu Signed-off-by: Joe Hu Co-authored-by: Joe Hu --- README.md | 3 +- src/json/json.cc | 22 ++++++++++ tst/integration/rdb_rejson/README.md | 24 ++++++++++ tst/integration/rdb_rejson/rejson-1.0.8.rdb | Bin 0 -> 4879 bytes tst/integration/rdb_rejson/rejson-2.0.11.rdb | Bin 0 -> 842 bytes tst/integration/rdb_rejson/rejson-2.0.6.rdb | Bin 0 -> 2750 bytes tst/integration/rdb_rejson/rejson-2.0.7.rdb | Bin 0 -> 2750 bytes tst/integration/rdb_rejson/rejson-2.0.8.rdb | Bin 0 -> 2750 bytes tst/integration/rdb_rejson/rejson-2.2.0.rdb | Bin 0 -> 799 bytes tst/integration/rdb_rejson/rejson-2.6.12.rdb | Bin 0 -> 795 bytes tst/integration/run.sh | 5 ++- tst/integration/test_json_basic.py | 4 +- tst/integration/test_rdb.py | 44 ++++++++++++++----- utils/load_1file_hostport.py | 39 ++++++++++++++++ 14 files changed, 124 insertions(+), 17 deletions(-) create mode 100644 tst/integration/rdb_rejson/README.md create mode 100644 tst/integration/rdb_rejson/rejson-1.0.8.rdb create mode 100644 tst/integration/rdb_rejson/rejson-2.0.11.rdb create mode 100644 tst/integration/rdb_rejson/rejson-2.0.6.rdb create mode 100644 tst/integration/rdb_rejson/rejson-2.0.7.rdb create mode 100644 tst/integration/rdb_rejson/rejson-2.0.8.rdb create mode 100644 tst/integration/rdb_rejson/rejson-2.2.0.rdb create mode 100644 tst/integration/rdb_rejson/rejson-2.6.12.rdb create mode 100755 utils/load_1file_hostport.py diff --git a/README.md b/README.md index 47dbf35..612d6fb 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ JSON.DEL JSON.FORGET JSON.GET JSON.MGET -JSON.MSET +JSON.MSET (#16) JSON.NUMINCRBY JSON.NUMMULTBY JSON.OBJLEN @@ -116,4 +116,3 @@ JSON.STRLEN JSON.TOGGLE JSON.TYPE ``` - diff --git a/src/json/json.cc b/src/json/json.cc index 262abe4..7158d2c 100644 --- a/src/json/json.cc +++ b/src/json/json.cc @@ -2393,6 +2393,26 @@ int scdtype_aux_load(ValkeyModuleIO *ctx, int encver, int when) { return VALKEYMODULE_OK; } +/* + * Stub for ftindex0 data type. There is one integer of 0's. + * There's an 18, a 19 and a 20. They don't appear to be any different when the data is empty :) + */ +#define FTINDEX_ENCVER 20 +int ftindex_aux_load(ValkeyModuleIO *ctx, int encver, int when) { + VALKEYMODULE_NOT_USED(encver); + VALKEYMODULE_NOT_USED(when); + if (!loadUnsigned(ctx, "ftindex")) return VALKEYMODULE_ERR; + return VALKEYMODULE_OK; +} + +#define GRAPHDT_ENCVER 11 +int graphdt_aux_load(ValkeyModuleIO *ctx, int encver, int when) { + VALKEYMODULE_NOT_USED(encver); + VALKEYMODULE_NOT_USED(when); + if (!loadUnsigned(ctx, "graphdt")) return VALKEYMODULE_ERR; + return VALKEYMODULE_OK; +} + #define GEARSDT_ENCVER 3 int gearsdt_aux_load(ValkeyModuleIO *ctx, int encver, int when) { VALKEYMODULE_NOT_USED(encver); @@ -2527,6 +2547,8 @@ extern "C" int ValkeyModule_OnLoad(ValkeyModuleCtx *ctx) { * Now create the stub datatypes for search */ if (!install_stub(ctx, "scdtype00", SCDTYPE_ENCVER, scdtype_aux_load)) return VALKEYMODULE_ERR; + if (!install_stub(ctx, "ft_index0", FTINDEX_ENCVER, ftindex_aux_load)) return VALKEYMODULE_ERR; + if (!install_stub(ctx, "graphdata", GRAPHDT_ENCVER, graphdt_aux_load)) return VALKEYMODULE_ERR; if (!install_stub(ctx, "GEARS_DT0", GEARSDT_ENCVER, gearsdt_aux_load)) return VALKEYMODULE_ERR; if (!install_stub(ctx, "GEAR_REQ0", GEARSRQ_ENCVER, gearsrq_aux_load)) return VALKEYMODULE_ERR; diff --git a/tst/integration/rdb_rejson/README.md b/tst/integration/rdb_rejson/README.md new file mode 100644 index 0000000..7bd74c0 --- /dev/null +++ b/tst/integration/rdb_rejson/README.md @@ -0,0 +1,24 @@ +#### How to create rdb file for a new ReJSON release? + +e.g., testing RDB compatibility with rejson 2.2.0. + +1. Run docker image redis-stack: + ```text + docker run -d -p 6379:6379 --name rejson redislabs/rejson:2.2.0 + ``` +2. Load store.json and create a key named "store": + ```text + python3 utils/load_1file_hostport.py tst/integration/data/store.json store + ``` +3. Save rdb: + ```text + valkey-cli save + ``` +4. Copy out the RDB file: + ```text + docker cp $(docker ps -q):/data/dump.rdb tst/integration/rdb_rejson/rejson-.rdb + ``` +5. run test_json_rdb_import.py: + ```text + TEST_PATTERN=test_import_rejson_rdbs make test + ``` diff --git a/tst/integration/rdb_rejson/rejson-1.0.8.rdb b/tst/integration/rdb_rejson/rejson-1.0.8.rdb new file mode 100644 index 0000000000000000000000000000000000000000..d9bda11ad714e98dbaa4ddb6003c2137fcded8f7 GIT binary patch literal 4879 zcmeHL-EZ606_=@!toH7y*lBzIN$^1 zx;XTKGZeu^J`_QgRKKZw>AF14xcamIpRv5Iyd5!46TX(@d+BKwW{oReAK5!;A}vX@ z5EFHz-<>&{aZ5oQY#yc=s!4{$m|^0qtOeCg<#L~`3GSy^*1q#UXd*)=p*yxd4npCN z*($|1Nu`zak+Co6?-xOJ#9_P9Hl=E>rMaM`WfLmd zsGhnH8dqjt<@-MO`lFC%jBme_*0_2hr zu#(d&p7MBLOKBx@ow{e?%b)xr>Kg{MQv;f)p%vh25`hh6-A!$vJFdV_b668??wsx5 zo}7Lh{P75HKe)5T7p!PbvPr4)q97fFv$PDNtqK$I0FxQ2G9DH$N5L@;2)6Mf}l$Auxi2Mx@#sfU&M zD0Gw$^6G}{3zuyPn1C@Bp$uIdmS5cFW9jt+rg{uoAG;>Ja0E=a25wQHDHeP9_vNWJ z3JvMiz)YA*mr9TGU;*V{(gM9F;Yna}RZjKK-`ExI*kkwjs82J{)PhACFi`(3<*5;k znN!sto%r?5FAmNhr5cPW57e&21GS<0V*kV^`*wzx)fg?uQ^1o8cV)oA-|@a`Px?Vf z6$@@DuE8?_uB^EHP-?7tUEv3Cwr4)~;w|A1;Ko}Q?k-SLRHjF-tgFtLU6;{}Uz9<| z1KkVtTC>@xS!TmDYmG!CCbgUj0X{iBV+fXRFS9NBzpLCGDQF&;+H&$PME?$qdT}Of zVOpT}gk7fDtkoMK>Nb&)@?Ju+K(1*tY(h^6M zOuXTW0putp>~=Vwcr;Gcf1G>p(B2T#rVhK!y&%Yh=NyLTp7Px;TXi9!xXrlNWoyt3FktV%9UL&L z4*fM9u`5=yW;Ggh_)Ho6#XeLPKXbIBp4s4~ccJsJJIn0u$mbmyjhNGvIqFkD``W6?EV4nkju5W9h8G7BON z^?(9cTeM|}t=`xWd+a^sM@15Z5DJiL8}H#FeP0f3)kR6wtV3SZ8t{d`%nu#qiH*^q zL(Xr*wK8d)#mNhlqNCt_3oI>rvicyL9ZY{{gC5xdZ?J literal 0 HcmV?d00001 diff --git a/tst/integration/rdb_rejson/rejson-2.0.11.rdb b/tst/integration/rdb_rejson/rejson-2.0.11.rdb new file mode 100644 index 0000000000000000000000000000000000000000..ddc4817b355e963684655c64a761da20c96e1b45 GIT binary patch literal 842 zcmYk4L5LGq9L8T}GRbClS*Yx4wb1_a+(QqUAv0-aH$iF=cdN!-kwn;owfbiAvU%>C zH_MyJ*04md_11#)P^3a(d+N!9P{CeGs$juO_ht{uPS&0Zh2FMgwL0jf$M1vh&-efM zH5M06H}m;?X_S$)#R7eUO3gMbV{SD5)^J!D3@Rhd4VgzDy!Y>OXEfFgXiN8~_u#|7 zr_gAU_-%b%QsOzB4$$89yT5slZ~e5LP!h4YwzK>Fle^o~NY+T;Nj_Dp9bdw9 z<}6#K92%4cFr$Vnlt?q zmqXd5{alpfsWyxM^aT_mbY)_3gYuq$71CYpz@Z3n^>bggDp#~qzVN#e4sX$RJ;mj0m&Y!9vo{k8HASv@!(++*BIxJO>hz=4ro=; zqB4McO22e2vknJGhF@XYZh;AI?^PMvdwt@FH|$+%$`NzF^t5 zZpHZ<$Qn*`qSUM1$zx~*_QqITv@Q*3;v^E4e DTqGZ5 literal 0 HcmV?d00001 diff --git a/tst/integration/rdb_rejson/rejson-2.0.6.rdb b/tst/integration/rdb_rejson/rejson-2.0.6.rdb new file mode 100644 index 0000000000000000000000000000000000000000..03fcd3fb147e40b3995d589f3316ee269a150068 GIT binary patch literal 2750 zcmds3-ESLN6`wDE*9yu)wGZq{OIJc=7a@WG0S_y*D-f)Zz-%Qzi-5kM@=)kaS%Jh8Z$dm&PD7_Ame))MZ&{LXKyAKduKEm0Ej%a`un z`_}DuZuLr{BnTe~54(jx$Fi|#)bQ`<%O~$m4d1;UmVGxfJ2Q#CCRs2X*PEnOM$%;5 zu2>{YOv;5GWx8s373dXd8TLM-rNU&H8Rd#c(rP>rRbhwEa5JW{1bbx9sWa%`UMe}v zbxFEOT+d+)27*LWL9RRf9w#5mB}H z5Tv-!uh2X9Ih!-QW67Q6)86t`yAU7(#--893b?AY}h zT#=e9D_Akhwy0Y)4DD&fb~MR9u6>iFXVtJ4j?dw)KDWk-1~uo473$EU$DH{^)^ML5 zxv5)vQ)!YYNrQ~n-3I}oy^epf=J45GvztrI3IZITM3OO1JaS*0dPYq1#C*QAz* zs9|NdTbnc(#Z>Ap2}2}MHZ~B~pkHpouXoEMv6V0v4*E}5Y}bPedNx0}N&@6XYtgco zE$D3}xX{a`BmOB?TDI*H>~9SVL;35ixR{86Ag|1Y$?A`}@?CHwgfjnqpUJE;GVKq- z5SP;Wg0x_`(8tBwQkJ^MX}8jpX=EU+X6@S2PbYI92?H z_Kn$=U3XyD8dFp)Ix@lo3)s+Ad&z*e^*elfR)PrR_rbUyRmn758rqrZ3vNiuJdz4- zDkO_FgOG@I6MKCbtHc}^ek!f3%<)}+>KtQEm0B>t%q1AttF71l6Lz5iCydZ;_@(3) zEU0$JB8fyiqN#DUEe?Haf9J|wd4Zbl`tH;6coe4clJBBzE*dOTY+Vs9hTay=eP=TB zo-md94OF>sty5JKkyu-Wi(?CY&Xf5x&XoTcQil3`Jv{!8aHia`a& zspY!s!TG?9?U*IVn4yOOS_F!En0=v|ZAqu_+rMND#SXr_E;xY^EfLY;@fi5 z7EP`{|8TwA70$kJON4WwN4~m43kF@6A8((aR-Kx#fSj0d43B)Ef4yspxr{o+3S6Ky z=!LIv;jKV2g|e7Tj%@tsTheee!Id{dw>wz74+}=IQ4IZh-%C=_Hb*bOno#0mN>N9m z$sx#n=zC85loqN_8N8=SXq&hjf=Enzsm;*>lD0tFM}l9h+aAMCdwSxg{;vMBV3X{> zqG|X-_xsRE!sHP6_iAAhiIa3ZOa_NYdMHc=5+sd$O%9NBGE5HirAQk6XZQd~4~NOz z2uY8Gi5i=O<31FySye?PJR_;vEI!YQ$5c2cs4yX^L&q?1UOb}01q^&%QjnJIo5yJWXavMVIo)GxDz_47S#Grz0 z4|{vCBkaOuRz%NjZn`gYNby(+ z{>^M6}M?c2tCYa6QdB=Ie< zN4F-P%e6B{U(b2P4fIMmtF(b1%N1~(NMKQVF!{CuFf^UUhE4t-Fhag++gsE4W9D5H z^G#RXRPiT9`oumM>Df9zA#2-H46McFK{PM@urye6V6@X??jTal#kq$IXPz3(DRC&q z51#s;d!6LFU*+;E@`-wJkxNGr%;4|jg5i|7q6Wrrs9|U$TuLD9&-|Rrmpd-lCUqc- z>VOt2CK7zl;owBW#et;(8Ttm7j(3szri0^{w6b-ilyHjt_}d>|o>%_)+3WuWQRY5E literal 0 HcmV?d00001 diff --git a/tst/integration/rdb_rejson/rejson-2.0.7.rdb b/tst/integration/rdb_rejson/rejson-2.0.7.rdb new file mode 100644 index 0000000000000000000000000000000000000000..4e30e37bf853eaa52f08781bc0ecdf29778395dc GIT binary patch literal 2750 zcmdT`TW=f36`sBDqKoB7N#xit>cfc*S@x3RE=5wJ?RZJ~BFmQSN)8l5RKy`U6xUkr zvb#&kw4gv~jiP7*qzMqXNl`#WTl4}1MS>P>P@rXFpe<6g^-JMCxb?^_`p}p5&44dS zXDK&Ue?lJy3m(qwp6@&7`_4?CJaJ|w9*>XS?{H|@aHGrA38Z3LEOozgD^N5%x24|? zlsuzGKl_5RJLML|U96ZD`Pg@SIKl&Jga$-C1dcivQ_zzzMw?2YGE@e*yqis4mZYXi>U zWnwlclb=RP;eb@J9e^lAAkYPdRXMz8I;M<8YQi+7E<7uFhG)X@XYdSZ8rGr9;v`BImuZA0~pl%%mk3FinUECSgKfAZwMWDolkZ3sV!E4qPD>Lpm@bHci?+FB z&}^x71zn81ht7R#D*GXt&i)!|3|;F~)nqiD&{CgJopt|7Ox_(n*un@X_KKamH(s{Tm)iZ3b_%&pi~+QCq)m4Yq^$qivRkjq{THAzPO2; z(5RM-YKcS~0zA7%k{XYtHlKU2+3ljU&)*c_T;yS(;gF(1Hl;^Blf-He6a1E+bqo)G ztiRngOAT`cEXm||BDXr|+Ps2`MyXkf{A&Np zV#zkgF2DvV^X8S+(O7C2@_!FJE3EPE4O6#7>a?sqY2dz9O!AoEjLKg!P{bLH@9X9A z^s7x5h}B#uRf+TDzzzKa{ioqoeBg?v@ojoA&^~(@g8MWDM-w=cQ1H+&&I~JfFo`p~ zTT_ELlTz@({xr^{6+ChfXGRn}KZ-M>3RdIua6AxK@SLhb7|w{QHpic5g%?yfhg6sp z)!`R-;Jk2Dg$q3Jc~MOr<$)RDm?Wn0888HV}<%wCS(SM5KpeS^!?w3mH>auWF3&eygRvF&{2^FCn;F6F&a8+SQx zmD|W^zDPOt?VsI7`p(B+oKqD|N%+1ZUA65eY2DEOko|zW3bBkDmqpu7{BrQb#;QiG zPOPhx;$CIT0J#;a2~MEbtn09mkcMicrXLZ9>JE%`dej}_C3i7533MiS+IF~l2@_8V z!*O=#RAAD!coms=lI?koNne&uG)hZMJjT5+{9CDLIAtcQp>dnf0q$o^Omf$J>Ss*4 z+;PD+i32&_rcBHT$t2r*Bs|%4J?b-;$CCg3TYd%^|Xq{$cH~`0w#Z*i79?aCQnNHI+G5g;mE*U;ZW$jL#)My zN0{_Al)fv@q69?Id_iarvwpWuO9nC93g_ffXMy*^|4eI3UzJyJ3}-+R6}%rp$X~}F zuX+CT*WA_;@_8;pnQsILBY=>Q$BzR8JTSm_DG*u@=mJEL<^Ka6$kDf!r+0`R_64(I zEE(LS46?mZc4d?OtGGRfrnZzYVOK4#R^H60SDvZ)mx(@sEW*C0G;T8Ot3g{C$(RZ| z1BRP5jb+#?`2!OMddg*oy1c*q(d|$QgJI0wTjQ2Kv%Zs0#FF7Pp+7W5SKyNEEJ3g2 zdc=dAh^H<=ci^f~FWF_iC#c4`>+>lV?BNQ-^{Q>rsYb0x9asqPOMtJ*147k?pL15M z!frUxrSY~+Cb^euiD5`HG$7j*KD(JbD5i!}g~8x(GL`0%fp^5JVZtvtQ!m2~*{yRC z0_n6Grm5gX$8OZ&in!XgsV_8akMh!OBkcdwrMF!vMShF?^z_ZI1m1q-U&sFgKJYzM literal 0 HcmV?d00001 diff --git a/tst/integration/rdb_rejson/rejson-2.0.8.rdb b/tst/integration/rdb_rejson/rejson-2.0.8.rdb new file mode 100644 index 0000000000000000000000000000000000000000..df7787b95f00afd0b2f75b20565757da6eafc1ae GIT binary patch literal 2750 zcmdT`-EUiG89yKX%16^Bbm>}EUk8q*$hZU+j6=eG0*{-S48 z*?R-p<-&td-DRa{l~v!n{iPn^K{vIRqBV!nYQbbJ;r@$n|EBuE%^%+uB@sV-@$S8E z-Ff@=9!Zo0;UnQ;w-5~3PMKPUTYd5Ly_wOwuSI14t<1IT4+om0!stq45x=Zblcd#n zJVI(FwLF)k=bNO*qE$xHWSkbgx=SJu4VI0HN79N4gYqgf%6hjv7GH~S;Yi?Y#dbZo zq-XQP>m*2?x0Wq?)q=iOk_&xYIv$u|rB&N5!J*cuFp__*l@OD05ahLm2wDFT_k9N( z$!pZ|-}9TyDti_9oiM_sw7w)Q87}m5@s5U&fI8GQPsFeg=Bt6q&4o(g~lsJwMMP$`0O{hq~Sw88aQh^hG|kR zy~5?A!bo`Vo_Hj9(V#!x}FssN&gwVQIu^rgcF>REY2{Vkj@U-k1o(U)SkXhO= ztg;LC5_lB`I}!|GXqNoBG0xU!G)_` zr&pNSuwahX%N5wm1ygRfT)*m{ur0gpz`hOUQ`Fel7!NM_Bcy7t81R<dlHs`CB7zET`A8Of24NBVCieL=R*5+-{6tz?Tj2Zt&^f`JDz#vW znJX}SDYmW&m&0!f7rs56c~_Xp{2HoUxY4O7$!I*GYFbpq=Wht=W>~@9o&)yc{Limxt?$ClkH|57YQ`D+c z6P6GYbB^JW5A?5h%`lfyr&xhYv<7|f6)wCP)KbZ)qG@AWMc?(hDm#Wh54h`B{tV}q#BIIy?ilkE!GJ2S#M`{BhO*rqIg_^OBnc^q-e)6Fe{!=;4%iDmz2>H z7?=~o3Va>|S0ptahS%YWtST`T<|S3x(HQl~UHW!5X0Y8C%216l&$Wjq*v+KK&twqCYK!0$Wt-=-CS%zNO^{59~iA-OCZvSQHvSZh4 za7}7%LGBB6+hYiZ9S!?`MTvafws&6R_nCK4`nNrJTk}7)-A~Pik=~u-MkKeJ4jT!1 z7_Ck}CJomd81M9$JB++^aZFq|_r#XYh$C@+%YaP24M#h#E<>vjT377MZ)V7w=|nJ<}vOXIO2ceLDfI zZ-tt5^xV$~k^CXKt#N2CVeof>VYx<$K?Qvg271vl?7~%6#1*Bv%@63167e|f6Ci(a zW0zQMpf?F?FeF*F2h+TB0+$TmM1B|Vn$S<=&#iwIek;s#@s+l-kGI3)u&!rO1hGrL zR6CGrHMuy-4?V_U{;!+39PHwKwJlrkcWbO@P;*PqaA#u9B3|WxE@3}RLUg6n==gfMalQ=vm}^zGy6 v9g;_O4r7O2A3(shd$ctXV%jV1l>*fX57KSNN-5zM`SHKk4-EYAeYf@>E^$3n literal 0 HcmV?d00001 diff --git a/tst/integration/rdb_rejson/rejson-2.2.0.rdb b/tst/integration/rdb_rejson/rejson-2.2.0.rdb new file mode 100644 index 0000000000000000000000000000000000000000..50a2d1eb2edd8eee1372c38c1aa2f7491b47beb3 GIT binary patch literal 799 zcmXAnPlyv&9LHZ~GRbClD=7Y{9@<}?dl1PCnTeU*1Zk7F+iKhuNrXMLR$nGB$#dVl zx4fBb4NDGfJrq2Mlp=cCo_g}wLoX$Dp-3IK?r&P>gCT!Tu1RJ;Z$2+&LWaMQawD= zVJeER2ol0>64w~#kWFx+69=rSXj2uz55{nKSs(pv_AFH)5wJ%27St=@=vHb?wg#}w zvd7>jBWei<=ks>4Sg<{};JS7J4)6S~lh4f#;nDcm$7bDu##O_*B>4uT)nIfTUCQ1^ ztKVIy{)igYUm(=z#;ofW?R>%WecPM*Zy;|x*VCytFXm69b$B_$rbX+@fhJBOQTa!k zH_a7JLwve*&S=I1vak~)f1G-%-+N`OQdxP4uh(vkHd0j~2%IPQnZX3nSx`I(EbgW5W=m~=~ye+oYR U!#b204$+%$PFhd?+OV literal 0 HcmV?d00001 diff --git a/tst/integration/rdb_rejson/rejson-2.6.12.rdb b/tst/integration/rdb_rejson/rejson-2.6.12.rdb new file mode 100644 index 0000000000000000000000000000000000000000..eb9e8e27b7ab30ff95e1e3c38811d015d3ea84ca GIT binary patch literal 795 zcmXAnJ&Y4a9L2}GUVq%3P(XYHisbL%O7F_Mj(ukfCAPWa!`vZcBV9oVjMrm(?q+9B zGwTc1$pz%P6evZ6putqBC{jdGn#AFx6f{Yf6d=|lRjPDIJ_xZ$`F_%SdQW6Q zT+Vf;X+_&i+dEWQOOEHb)4Bgai-meznOc6x0{Ud%Zg!`szNT$Epuv;T-g{`8BC=z* zh^AxoFFJ^!q@_ct=yiXE}4qD_^C?~LK_dUW#FxeHVUM8G=bJ5a9#H|M$qJD2y0McbSC_mDT4??s8XFBi_B4S1Dev!Zq7KoiH2sQeR|Uz)3&2KY?t zqR|WoWN{Rt;w14b`rx&(MrGv{zE!(B-bz%3AaIG`=LQobD*rLpB#QK)PK4Hz)Q#kZ zRJ;vUo;gSoABbo}?Q~EZ8|P-~Z_~?pF5HEB|omU(UU6=^XtG2a|oC!$X{bY`E}P%OkxD__qysHQ~uJ-9-);Rt*Yp$Ez0Qo(kM z#nQXb2gb5fh~oD%zo+T&dKR~sKkzd@FMekDlApZ-Bh-#!OL4d46hDGb|FVw7hC}rB N;b!mK#P`>J`VW$#3cLUS literal 0 HcmV?d00001 diff --git a/tst/integration/run.sh b/tst/integration/run.sh index f454f9f..7cb2bb5 100755 --- a/tst/integration/run.sh +++ b/tst/integration/run.sh @@ -18,8 +18,9 @@ fi DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" cd "${DIR}" -export MODULE_PATH=$2/build/src/libjson.so -echo "Running integration tests against Valkey version ${SERVER_VERSION}" +export SOURCE_DIR=$2 +export MODULE_PATH=${SOURCE_DIR}/build/src/libjson.so +echo "Running integration tests against Valkey version $SERVER_VERSION" if [[ ! -z "${TEST_PATTERN}" ]] ; then export TEST_PATTERN="-k ${TEST_PATTERN}" diff --git a/tst/integration/test_json_basic.py b/tst/integration/test_json_basic.py index 54489a2..b487ab7 100644 --- a/tst/integration/test_json_basic.py +++ b/tst/integration/test_json_basic.py @@ -13,6 +13,8 @@ import json from math import isclose, isnan, isinf, frexp from json_test_case import JsonTestCase +logging.basicConfig(level=logging.DEBUG) + DATA_ORGANISM = ''' { "heavy_animal" : 200, @@ -1693,7 +1695,7 @@ class TestJsonBasic(JsonTestCase): v.decode() == val or v.decode() == val_alt) v = client.execute_command( 'JSON.NUMMULTBY', wikipedia, '.foo', mult) - # print("DEBUG val: %s, mult: %f, v: %s, exp: %s" %(val, mult, v.decode(), exp)) + # logging.debug("DEBUG val: %s, mult: %f, v: %s, exp: %s" %(val, mult, v.decode(), exp)) assert v is not None and v.decode() == exp or v.decode() == exp_alt v = client.execute_command( 'JSON.GET', wikipedia, '.foo') diff --git a/tst/integration/test_rdb.py b/tst/integration/test_rdb.py index da8b3d8..bdad286 100644 --- a/tst/integration/test_rdb.py +++ b/tst/integration/test_rdb.py @@ -1,17 +1,9 @@ -from utils_json import DEFAULT_MAX_PATH_LIMIT, \ - DEFAULT_STORE_PATH -from valkey.exceptions import ResponseError, NoPermissionError -from valkeytests.conftest import resource_port_tracker -import pytest -import glob -import logging -import os -import random -import struct -import json -from math import isclose, isnan, isinf, frexp +from utils_json import DEFAULT_MAX_PATH_LIMIT, DEFAULT_STORE_PATH from json_test_case import JsonTestCase +from valkeytests.conftest import resource_port_tracker +import logging, os, pathlib +logging.basicConfig(level=logging.DEBUG) class TestRdb(JsonTestCase): @@ -42,3 +34,31 @@ class TestRdb(JsonTestCase): assert True == client.execute_command('save') client.execute_command('FLUSHDB') assert b'OK' == client.execute_command('DEBUG', 'RELOAD', 'NOSAVE') + + def test_import_rejson_rdbs(self): + ''' + Verify we can load RDBs generated from ReJSON. + Each RDB file contains JSON key "store" (data/store.json). + ''' + self.load_rdbs_from_dir('rdb_rejson') + + def load_rdbs_from_dir(self, dir): + src_dir = os.getenv('SOURCE_DIR') + rdb_dir = f"{src_dir}/tst/integration/{dir}" + assert os.path.exists(rdb_dir) + for (dirpath, dirnames, filenames) in os.walk(rdb_dir): + for filename in filenames: + if pathlib.Path(filename).suffix == '.rdb': + file_path = os.path.join(dirpath, filename) + self.load_rdb_file(file_path, filename) + + def load_rdb_file(self, rdb_path, rdb_name): + new_path = os.path.join(self.testdir, rdb_name) + os.system(f"cp -f {rdb_path} {new_path}") + logging.info(f"Loading RDB file {new_path}") + self.client.execute_command(f"config set dbfilename {rdb_name}") + self.client.execute_command("debug reload nosave") + self.verify_keys_in_rejson_rdb() + + def verify_keys_in_rejson_rdb(self): + assert b'["The World Almanac and Book of Facts 2021"]' == self.client.execute_command('json.get', 'store', '$..books[?(@.price>10&&@.price<22&&@.isbn)].title') diff --git a/utils/load_1file_hostport.py b/utils/load_1file_hostport.py new file mode 100755 index 0000000..0a00a8d --- /dev/null +++ b/utils/load_1file_hostport.py @@ -0,0 +1,39 @@ +#!python3 +# +# Load a JSON file and create a key. +# Usage: +# [HOST=] [PORT=] [SSL=] python3 load_1file_hostport.py +# +# e.g. +# python3 load_1file_hostport.py ../amztests/data/wikipedia.json wikipedia +# PORT=6380 python3 load_1file_hostport.py ../amztests/data/wikipedia.json wikipedia +# +import redis, sys, os, logging +from redis.exceptions import ResponseError, ConnectionError, TimeoutError + +if len(sys.argv) < 3: + print("Usage: [HOST=] [PORT=] [SSL=] python3 load_1file_hostport.py ") + exit(1) + +host = os.getenv('HOST', 'localhost') +port = os.getenv('PORT', '6379') +ssl = os.getenv('SSL', 'False') +is_ssl = (ssl == 'True') +json_file_path = sys.argv[1] +key = sys.argv[2] + +r = redis.Redis(host=host, port=port, ssl=is_ssl, socket_timeout=3) +try: + r.ping() + logging.info(f"Connected to valkey {host}:{port}, ssl: {is_ssl}") +except (ConnectionError, TimeoutError): + logging.error(f"Failed to connect to valkey {host}:{port}, ssl: {is_ssl}") + exit(1) + +def load_file(json_file_path, key): + with open(json_file_path, 'r') as f: + data = f.read() + r.execute_command('json.set', key, '.', data) + logging.info("Created key %s" %key) + +load_file(json_file_path, key)