From d1582f6d39718e12ca79cc16ff86bddc8d5747e3 Mon Sep 17 00:00:00 2001 From: Dmitry Kropachev Date: Thu, 3 Oct 2024 09:25:42 -0400 Subject: [PATCH] tests: add compressor tests --- compressor_test.go | 179 +++++++++++++++--- testdata/frames/big_query_request.bin | Bin 0 -> 47522 bytes testdata/frames/big_query_response.bin | Bin 0 -> 3659 bytes testdata/frames/medium_query_request.bin | Bin 0 -> 3430 bytes testdata/frames/medium_query_response.bin | Bin 0 -> 1498 bytes testdata/frames/prepare_statement_request.bin | Bin 0 -> 250 bytes .../frames/prepare_statement_response.bin | Bin 0 -> 236 bytes testdata/frames/small_query_request.bin | Bin 0 -> 363 bytes testdata/frames/small_query_response.bin | Bin 0 -> 257 bytes 9 files changed, 155 insertions(+), 24 deletions(-) create mode 100644 testdata/frames/big_query_request.bin create mode 100644 testdata/frames/big_query_response.bin create mode 100644 testdata/frames/medium_query_request.bin create mode 100644 testdata/frames/medium_query_response.bin create mode 100644 testdata/frames/prepare_statement_request.bin create mode 100644 testdata/frames/prepare_statement_response.bin create mode 100644 testdata/frames/small_query_request.bin create mode 100644 testdata/frames/small_query_response.bin diff --git a/compressor_test.go b/compressor_test.go index 835093932..d04b51ad9 100644 --- a/compressor_test.go +++ b/compressor_test.go @@ -1,38 +1,169 @@ -package gocql +package gocql_test import ( "bytes" + "os" "testing" "github.com/golang/snappy" + + "github.com/gocql/gocql" ) +type frameExample struct { + Name string + Frame []byte + FilePath string +} + +var frameExamples = struct { + Requests []frameExample + Responses []frameExample +}{ + Requests: []frameExample{ + { + Name: "Small query request", + FilePath: "testdata/frames/small_query_request.bin", + }, + { + Name: "Medium query request", + FilePath: "testdata/frames/medium_query_request.bin", + }, + { + Name: "Big query request", + FilePath: "testdata/frames/big_query_request.bin", + }, + { + Name: "Prepare statement request", + FilePath: "testdata/frames/prepare_statement_request.bin", + }, + }, + Responses: []frameExample{ + { + Name: "Small query response", + FilePath: "testdata/frames/small_query_response.bin", + }, + { + Name: "Medium query response", + FilePath: "testdata/frames/medium_query_response.bin", + }, + { + Name: "Big query response", + FilePath: "testdata/frames/big_query_response.bin", + }, + { + Name: "Prepare statement response", + FilePath: "testdata/frames/prepare_statement_response.bin", + }, + }, +} + func TestSnappyCompressor(t *testing.T) { - c := SnappyCompressor{} - if c.Name() != "snappy" { - t.Fatalf("expected name to be 'snappy', got %v", c.Name()) - } + t.Run("basic", func(t *testing.T) { + c := gocql.SnappyCompressor{} + if c.Name() != "snappy" { + t.Fatalf("expected name to be 'snappy', got %v", c.Name()) + } - str := "My Test String" - //Test Encoding - expected := snappy.Encode(nil, []byte(str)) - if res, err := c.Encode([]byte(str)); err != nil { - t.Fatalf("failed to encode '%v' with error %v", str, err) - } else if bytes.Compare(expected, res) != 0 { - t.Fatal("failed to match the expected encoded value with the result encoded value.") - } + str := "My Test String" + //Test Encoding + expected := snappy.Encode(nil, []byte(str)) + if res, err := c.Encode([]byte(str)); err != nil { + t.Fatalf("failed to encode '%v' with error %v", str, err) + } else if bytes.Compare(expected, res) != 0 { + t.Fatal("failed to match the expected encoded value with the result encoded value.") + } - val, err := c.Encode([]byte(str)) - if err != nil { - t.Fatalf("failed to encode '%v' with error '%v'", str, err) - } + val, err := c.Encode([]byte(str)) + if err != nil { + t.Fatalf("failed to encode '%v' with error '%v'", str, err) + } + + //Test Decoding + if expected, err := snappy.Decode(nil, val); err != nil { + t.Fatalf("failed to decode '%v' with error %v", val, err) + } else if res, err := c.Decode(val); err != nil { + t.Fatalf("failed to decode '%v' with error %v", val, err) + } else if bytes.Compare(expected, res) != 0 { + t.Fatal("failed to match the expected decoded value with the result decoded value.") + } + }) + + t.Run("frame-examples", func(t *testing.T) { + c := gocql.SnappyCompressor{} - //Test Decoding - if expected, err := snappy.Decode(nil, val); err != nil { - t.Fatalf("failed to decode '%v' with error %v", val, err) - } else if res, err := c.Decode(val); err != nil { - t.Fatalf("failed to decode '%v' with error %v", val, err) - } else if bytes.Compare(expected, res) != 0 { - t.Fatal("failed to match the expected decoded value with the result decoded value.") + t.Run("Encode", func(t *testing.T) { + for _, frame := range frameExamples.Requests { + t.Run(frame.Name, func(t *testing.T) { + encoded, err := c.Encode(frame.Frame) + if err != nil { + t.Fatalf("failed to encode frame %s", frame.Name) + } + decoded, err := c.Decode(encoded) + if err != nil { + t.Fatalf("failed to decode frame %s", frame.Name) + } + + if bytes.Compare(decoded, frame.Frame) != 0 { + t.Fatalf("failed to match the decoded value with the original value") + } + t.Logf("Compression rate %f", float64(len(encoded))/float64(len(frame.Frame))) + }) + } + }) + + t.Run("Decode", func(t *testing.T) { + for _, frame := range frameExamples.Responses { + t.Run(frame.Name, func(t *testing.T) { + decoded, err := c.Decode(frame.Frame) + if err != nil { + t.Fatalf("failed to decode frame %s", frame.Name) + } + + if len(decoded) == 0 { + t.Fatalf("frame was decoded to empty slice") + } + }) + } + }) + }) +} + +func BenchmarkSnappyCompressor(b *testing.B) { + c := gocql.SnappyCompressor{} + b.Run("Decode", func(b *testing.B) { + for _, frame := range frameExamples.Responses { + b.Run(frame.Name, func(b *testing.B) { + for x := 0; x < b.N; x++ { + _, _ = c.Decode(frame.Frame) + } + }) + } + }) + + b.Run("Encode", func(b *testing.B) { + for _, frame := range frameExamples.Requests { + b.Run(frame.Name, func(b *testing.B) { + for x := 0; x < b.N; x++ { + _, _ = c.Encode(frame.Frame) + } + }) + } + }) +} + +func init() { + var err error + for id, def := range frameExamples.Requests { + frameExamples.Requests[id].Frame, err = os.ReadFile(def.FilePath) + if err != nil { + panic("can't read file " + def.FilePath) + } + } + for id, def := range frameExamples.Responses { + frameExamples.Responses[id].Frame, err = os.ReadFile(def.FilePath) + if err != nil { + panic("can't read file " + def.FilePath) + } } } diff --git a/testdata/frames/big_query_request.bin b/testdata/frames/big_query_request.bin new file mode 100644 index 0000000000000000000000000000000000000000..7d9a8b8ef505d42c616bd43b98fa38843911c96f GIT binary patch literal 47522 zcmeHQzi%8x6h0&hh>!>k^=KO!?sPw5J5J@~&PnXpj+3*12&EYBj(zLf+d1vdIanx& z7CI>TGpH#7MMOsx3R+4EDoP~Yo88-;z1-QCI1SS0!d~D0xY;*v-n=*8`{vcI{_)f8 z=LbK3_wDHZ&gj?Q{(Mn;`=i?XwOZ}!FF(Hf{OcDV{Qb?N;P)SnzIsNVy;G~b_5JQ& zAO1tf?;WVrh)-nF9mpg*SF0WUJKU<(o^5=2MF`K=qp^(7yc>f5r4M2`QuLp9p!|W@ zier5$O{nA4`#3wVM&n4IDV5SipWBZ_eyhDb4CwP#vz1+KKRODN)a>Pt-PVIRf0R8L z$?{xJEBBNd$uQ!koX|auK&uTyZ3@dKHK_6K4KfH4m2$(fci}IfH%d*Sl;H=p+8wbO zjYQu#x3LgH!xHdzl}YqiN8$8sizi59g|hdkdgEB9Mn+v7*t4x>v)S@;nF#UJkwH2P zqsWTP+m@%Y?%gO8WL-j~>!Ep)VF*x8LVKcMo=VyvNQ%#)&>rzHueb4Rl}D z>A?N$YH>3f4`ij;Rwgnrz5K1(&332WY}H#UvzMtjs9v;E?=)vGA`zGgH_GdhGDXU$ zpcFzy3>UWbmNLsUb+z7lsTH$LZMEy2*5ama#exKMZ1tt+F=}ja{5U@6@yO%ebP+u9Ejhp&2;s@=7(QyBaB(`+@d{D&eDhlS7rnq%Y|kQ1d%-G+IV?+N9}~ z_oFwQ)t%<`Ib-1ss(DXEOX>Ogg>Ai7Z+700o?Cs-&5akRF&T)FiYwN}83NO3qNh$( zq{n=vBUNuCV|h%yJY$M0qogkr>5c^I2zQ`#HCcMnlVU`2M@^@MldQzTh7r#Zq_msyK*qijlT;-l zjEzc;q_4d5%*9kzyD}Ln6UN8ROD!d-TgimJqHOJqq&}5r6?@|f>X2`3JmD)|LryE_ zh$;3HB~v916B!3WK9PxvdG=))eL+4&ApA*c^oYcCNY|ATswf((S*#LwPMfD?(n!(Q z(ZsqUvdsVCB>b=i* zHimS;hR;o4*YOe^)@irIei$$AFP7zbopqb$KDQUEoz>~Qa%Yjp#!j2_)CHZjT5q=N z?dwHn*;cT*dV1yQ749*_030PC20#pug?oqrD3U`AfEWNV0Ahd}0x@v$Q4T0wEWuPz&S&O|#&T3*;de zsLYuH4geg$rVSw%2)RJu1Aq^}qygXn71kRWPH=+R zXw2cgSWg5v0B`^S9KcQ}Q~o*l0N?|F4*)&@_yFJo6w5Wh0e}NsYWpkT0Kfq_5~CmB z0Kfr?i3K=-@G4t}0S5pMfW1NUg*iK2&`uTD89@!!fyu$^iU_b*r6PCg0rH|s1sb4b=cN}*sX8umVWMOw;+0%kat4&Gy*-p z*txUJbK%fywL4-n8Z9i)y{k;3$2tnB;(6im(E>a#t05N%xj^|!D`Eh|0Eht)10*7h zjY1577yvPVof^v>3K0WXfs~#jVgSSd!!U|6&e^s+m3==6$Hx0ucn_8I?ZKW7RO5t# z584&C-{(Jf4|aDvaDwOXI*|*6Tp;8Eabn!Hdb3mSxYZ(g?s=_Rc;Ezs6Kow9QRYk` z7YMmP$OS?!(5bYW@#ib!v^qbI^qErDVCIYEPW+eCC0pe>dUdxa-~fmLvYCc`m03sb zmNK#e!DRl->>lrk0T2Vsst))7#jrvQFq#ik6?yL91Aq_UxhV+DxExkyo-z#q^#M>H z0DJ)O0gwv>K0uKjhFqZeE>>ECUHfNdpegB3c)b%DA8S79KiIJ!Xn&{@KDswKR7tE1 zttVU_?m`TJ7$94%T7v6}7yvNiiEH(y3o2r7P^Ap-VTKq0F#uu! Y!~lo^*cz@kn>0-nvT&(z|L+*!KY>lL3;+NC literal 0 HcmV?d00001 diff --git a/testdata/frames/big_query_response.bin b/testdata/frames/big_query_response.bin new file mode 100644 index 0000000000000000000000000000000000000000..eebf9398bd89722b90c8552b05092e57995ba350 GIT binary patch literal 3659 zcmeHK-)|H}9G}_SqjQ(Na?qlP%OQxrR7>%uJXGkbGviBrF*mI z?p~pqf z@9g(GpU-z5=B=Zi2ZsRw0*A=4kOOiAuUzn5edXq&`^R?aKbl0gC^ObOSKi z{<0rqS+mL&!p7uQJZo|XBW21hd5~%)+|8IZN?gNYjvW1Oot7)6HAbn!gZ9k1@Z462 zqI|cZb9W-1hVSh{yvC=rjx6LS5ZV7yHXIwOW@!qd4uat|3L zdCfK|t{lbkHcB+FFWhJ8RN3di5X$89uqL!+us0_UHFSn6wzZFHuD7ec2(bDaXqy84 zJ|%=Vo0Sq#zXDAmiP&y7@KZ#MtI1eA5lf^tH3LMMo^AqCDwd3IY66YRKo!0hkuzKg zle$!2?*&+?fk(~()Ir@7X8}sb5*@FCO=m$cp~jMl;#m;xX1L$BhCAbJIWS%?fuVpu zb#>R^z%)?XK1xpuB4O$^L75hU`Lf}b8r~n82@*yX2QI&NN9ep0UXx1W=g3Imju7m! z+!9eXdb;bnr^U?XhL1&zTc-uE{^Ya}>K}7U7TbI^l-)!5#^Rl7H#`sUcoaBrqo`=!r?x2`?~f2xC&Roy3RQjhJO7!_5m$bE5)E5q z;*-7IWv<~U#eCGOnu{Hcn51BsQxTo(-^ogZX%tr-YGZ@B)GiW@%51fmh~i#ik5JcO z!wol2u7XmBUDcEUv2_(hJII(?5tWq?6yOF?*$?GwEfAy{SL|+vIi}f^I20Fb!gNgb z6PvPI2OA^efeH*owW{M>F+m!%*jU4w)(i~hU0z>$Igk&bkjuSX_{LDX&VS%6dTsF`>rVy@y|T1K|v1u1!pw>D*smR6g~JgFDmbLHaln*QN@`QR8aKCYlQ$DqbXU ziPxrWvHoe$srnFa=ys8}lB+>mDN{y8 z5LC)EV*H(2pY*qCDzP<(c7OeU{PK#)B1m-_vJ-4igJ zj>XlOx-K=*bn);P(zt)z-*^GYk3?zyn`dC2fq4ez8JK5ao`HD={#OQm7Ny$KWUVoo z_0B%6bPm*B*Kz6YH(U1CzCJ0npOktal5XA*>L7{$;A`d)D*^B(qT-9y>H%(fik1ay zP=VOK8t@W~1sXsrtmCm@LD8V5o`6rFQDQ>mTMX2|;<-6FI|p+-#s`D&vjAGwGzGWA z@FEd@3nj21&;n`#s5UVL!*I(^{_2A#dw+fGA&-{^spI19#Lkqwm)6y`+)Mp3R$ln~ L<@;|hb>I9Kl;D`+ literal 0 HcmV?d00001 diff --git a/testdata/frames/medium_query_request.bin b/testdata/frames/medium_query_request.bin new file mode 100644 index 0000000000000000000000000000000000000000..610dfb2ba0851d2b6bca1efe73bb138ae10b6848 GIT binary patch literal 3430 zcmb_f&2Jk;6yLNV(5RwCxpEjSNCgR7yLO$Ap4>QTn>0=X4qrk&jCaTO#=A3ScAV6p zpdJz806p?2a6sZ%Kmsm^8y5l+S2!RLRQv%*yfi-jTY88js#-npVcd1x{%k$e2xP3blVvwWiziEIVMvFvHNi{~ zi)av{DSM!k_XR5}uqhatln3KY1?u~f#b{XnEVu!jC{~g&g$ucbB3Tb3Qd5Q+f)FS~ zz^*bSMMs3e;I!!qRB2GQ-^?m@M67675x$nXj^ns?f(apq1_p6E2ty5-y-D|J&67a~ zj3D+ajC#7W4U6RWU}IueYBg+b>{hqz+r}atDfXDBOyto(^RR{kclxu*)v(i|8M8Ge zRI0V)R0XF{%sFn(EsaiN+|N!b<%-VeB!ED5(I~qDWD1#L{t$!=3@6&U%G5NbF6P{a ztQa-bE#!*sWK%ad0f3sCFR91C*tCB;>7`yA!fYobFBrbblAQ7klTDJ>qCm9_yX+y& zK`S4l__2w8xwJ@b(e^~5Ul*!H&DiNvqEGV5Rl__GWJ$g<70GvcswE)MiM_T*c~fAo z_VSh<5MG-}?A`3vndHEi_!MY-*9caDQJ?PHzLTh`;5T9 z-}MxUJsQ$_5aJyHq+RDN$~{K9F_R?Vipd7`n0;Kj7+_VUvdvV$o5rE0LTXiZVT+-) zBS^hYdzpM=0#!%V`~lARA2^kcfr)#P(U_6Cq}(U;fJ(;k_C<{DKuzHjuNx~70Zet6 zH$*5yG^814(!A5gv5YE8Y9j3FQUuBpFK@sBMGRMXjULCgT>(|jLvJZB|12c5_F_vd179vZ_E2K){uAG>mD-ckUhNPltm+k_t#XQun(B8-zoXyiq z;JXRM2*M=+FFdqa1VCzB%4QsmEKXg|6auB3vxtR2VpbYrV?0;sL5|n84)o79gute*zb&A72i^w4E$E-acX;#;(4I-&&n7L(@WCCholDv$ zlNLT@^f<0_1s>F!YXmIxU6kz85ZnGpAsNB8KT=FauzmW4ze~UMq6`0g@!+Fp)rTlK V`ti(yWi7mK%{_Pb)t^7j{Rc`RC%6Cr literal 0 HcmV?d00001 diff --git a/testdata/frames/medium_query_response.bin b/testdata/frames/medium_query_response.bin new file mode 100644 index 0000000000000000000000000000000000000000..80c541546f3a57e731b56364ab583ac802a295c9 GIT binary patch literal 1498 zcmX9;Z)_Ar6rb7d(Y?!FY3Vf{*ur#eX~DbYZjZbEfnwY1**{!s;mUtYGPgU|+jejE z+?{JVO;Iqxm zLJ`xl(utNtuAsO;xTK5`J&y({wWl#NZR#qa|My9uXxU{#TyAt=S%sEep%miYroq+G zNHpXbfe83^$DSlQ^Yqu{0MZ_Uu4`b_s|HYyRm@}U zThJVkvBUcOcbl|`77ItB;b?qY3y=sk63sx4hhvd#&7g5DD8W-rN|JZNB8(Uv9)Q$J zc=Q60dI>vm9!QCBwD%a;b{m^3UAXSiqL5mw-yBb%SMU@%xF}Tj+boaOtrdf{ zgY#mtr{Pl(q0V^$be!Y|jFws6radcU+VSGXEBNjVx0e}u(pS(F7i9Ne74Bt;Z zIc_&81}X9jD-fztakk=COR$ej6U#2bjpGTV6fngT#8GbT@xsLV3OR!vtokZ=s@jH% zK+@)1bsBbYu^a*}+$yTN=Y^eWh37X2OIL%OBH5BL@w4yTmlALO>@jJ=#&c)$g9YBk zX@dA@lyrt%9a}hSS|%&^T-uwWc}#VJN-lAbNf~i+SSJeIBt}DM7&}vhnRKGz&dH5X z?sZDKxtJdiJcAuV?;Q?s z!le!sVIZWJTxJ(|yexLRl;)3jm^~8`CC;^%ZrvWq2?Lm6l(DVS^0VYmR9BU*?`7Sl z>|Q^mf;?u^a>M4%B&^Obo?&7gh$jP#D|zo51KkGqcWd5R^`_+c6+$&H9DP@6YHRP{ z<#7I?gP(a&l2GPg3nf!CbvgBOk2tnBaSza1qwWv?v-iDan2V8`E?SiZ3sZvDo!F2x8~{(SBL6e+~u{;fNO2 z+T(N0myUcb&-!M4RUx@5EcbbqzB+?L>aOj*{NTrdnW_<4?mj6GK}o)ITd0Ln69C>8 zZm|IXPc$UHRw^ChQbo?TVWpJCj<*uL4#WNi&u z99x>J)7-`jtKk=ZY3-s6cf(+f2!DbySmAF4m42z}sSJZ~U@!lL;mP6qe-^mCJVsoG cc4H@*_grqTYJC*{qg+_|*OkZb*R%Kj1KpgT4gdfE literal 0 HcmV?d00001 diff --git a/testdata/frames/prepare_statement_request.bin b/testdata/frames/prepare_statement_request.bin new file mode 100644 index 0000000000000000000000000000000000000000..87b3b12c52ecabe37a46b7e2e58571fc749e3621 GIT binary patch literal 250 zcma)$!3u*g42JtCIV$)LV+Rkya4>aON!x4-q*iR*qwlq6d3riXYeZR_{6 oJeLoTCBqKOuy81|feNIjvLjtROuSI6;eNhM?EuxOfq$d^0?5Zw+yDRo literal 0 HcmV?d00001 diff --git a/testdata/frames/prepare_statement_response.bin b/testdata/frames/prepare_statement_response.bin new file mode 100644 index 0000000000000000000000000000000000000000..da8ea7abb62802073bccf647884ba93580b93a58 GIT binary patch literal 236 zcmW+xy-EW?7@RNuWH-rr2?!o|g$9w7f+>PUN^JxiJBwrQZjFn(*_hk&4MeaD_&7E; z!7i1JtuNw-#Y{0XFf;G12w)ripO4G+?dR&v-(35z&F?p>#7LBgomnWKTpmpwk<`wX zCii-gM_o7rK?hmW*a`_0_0FR89MgV*F1j=rJ?mxppqEhSP?8mPX6F$td9h!(P+&{- z(hwZ?OFB*OUCQ?eEOO3BEP}`}Fr@v>PzJI&OF(i-Ir&LI4kIIwU~!nl;{{UX zAndgB)qan1kQh**I*?`sVulnT)`W6c3QJ2XfNbWp{Cp6V1hxQ3RRMW0Ngp7a6T}B% zunj<(3Cd@N(jYky2H60j*`PE#lm_|-EDkcq3W!1a*wQjnb5aaJGG&Q5AQ~cK1Qh|% t5D{aj2#Ds>cxU>gGME43uJ;pUN_s#tSFbP$GcX8uFt8~%=((zO005jOL;e5& literal 0 HcmV?d00001 diff --git a/testdata/frames/small_query_response.bin b/testdata/frames/small_query_response.bin new file mode 100644 index 0000000000000000000000000000000000000000..1881dd403dc6d6dee8ac1472d1f7f358f5f5837d GIT binary patch literal 257 zcmWlUu}Z^00EYk5#-^#U843pM(2BuEE9gsfuN8EWa7oU3aOu_La+3`dI(2Yxa&b5M zKyE&Zm+^=1gYW;c9sso9t$%*&{PSDfe(bJp9)lB130`|}7BYDekz$2HuMj+8QASsh zqOoAG$?;)X^0W#8hlGQeFZfbnZ+C}&EM$!Rw-BC`0xfNjE?Ey#mhg-U9OwzG+D>Ij z{?OK!K!@D>PeM`!TVEhJ@AD;7@EWmA=A$!o^cdD`Ah<~x!ZnUH_e~5&aNj5J3WJ|k j8^9&?Sn