From 37eca6a8fc0130f787e3d9ec1c6370a425f8c7fe Mon Sep 17 00:00:00 2001 From: Raul Gutierrez S Date: Fri, 10 Jul 2015 16:21:25 -0700 Subject: [PATCH] tests(zab): covers CommitAndActivate, FollowerInfo & Revalidate Signed-off-by: Raul Gutierrez S --- .../resources/zab_commitandactivate.pcap | Bin 0 -> 9183 bytes .../tests/resources/zab_followerinfo.pcap | Bin 0 -> 4442 bytes zktraffic/tests/resources/zab_revalidate.pcap | Bin 0 -> 5667 bytes zktraffic/tests/test_zab.py | 72 +++++++++++++++--- zktraffic/zab/quorum_packet.py | 18 ++--- 5 files changed, 68 insertions(+), 22 deletions(-) create mode 100644 zktraffic/tests/resources/zab_commitandactivate.pcap create mode 100644 zktraffic/tests/resources/zab_followerinfo.pcap create mode 100644 zktraffic/tests/resources/zab_revalidate.pcap diff --git a/zktraffic/tests/resources/zab_commitandactivate.pcap b/zktraffic/tests/resources/zab_commitandactivate.pcap new file mode 100644 index 0000000000000000000000000000000000000000..7a20e4ff75b3cf2cd76154b0cf713854603f383d GIT binary patch literal 9183 zcmeI1ZBP~08OQhX;(}31T1VS!z(Q^HQ^Lgy5+WT#Yl9=9OsiCFD(@P+maF0rnyD}2 zOgn9dG;MCtA*MmJ6)uj|s;C%Ise&cybaqA?nlWEG*2bvIRxH*Q zPYJBtu4x|JCAlrbGn+eWMsIffWXI<{Wserohn}RV=?y)H(i^(_NgaP9aZHLN(3d`DJU(&CAr9h@@XPU(4I@rAvqU%){qWz zd7UVQ^gV9*VvhNZGUix7P`G1FM0#UKDmgY^cC64$5gIMgKi0{xOLXi8}^L8MzaEOoXO@ z67CQb-bZgxKF#(%LN2{6axV1D`UtuFP+0?GC3CD!Pjk6XUX{@0I!l9MVZymx%mJHw8+LD_YR;{LJHZ(|j6 zV!5P<-Z7o9Rkd%cGj7p4p!`xv(T{=R|5T!&cg(maQg%`1)+m!H`RW>c!fMbhD7*&4 zL|S66LEpCYhQ6&b1zv-MTndzwkPb@tfJHH9x+CP;-dHI0>PjC6B_~Btc%_#FuXV)P zE6sA*hPc&=#%d@A)=7$}^j_-ui*AZNq_|D#gz;Ub_$^mOTUGnllHc28zeQC+X;o76 zZczN6NEGyr=|l{a+5b|m0}nv)M%FL34s^s3X%(xgwGJSc{-J zKn(v@qgp}XGu?5j`jEZqCIyO1m5TZaDCSI) z6j6^=)R~#l6ic2?()!3I-15a{wPP8dGVhCoqB(9mGA-{r#2P%Xh<5mXQX*_+rbVXSqdjqynw!^d-Szk@&pi5xPBBx)992o|dlG7M&7~ZUR<$BI)R8d07 zpoD*8QOxCfXl8Txii1*2lxL$+zDbnmBi>j8N}yU$%xN}!g{Ij%ju8(^G5T=lkCL=C zgu^XgY*H-Md!XpQD=AVRmT#gtq#J$s=xNEAK6+GSB!^Kp#4foGs;=~ z-;iiDzwr1c(uyae1-_W9a4R&G)#Rk0@ulw$5#J}bUWy#!2AU|hQpB%T%ou~Bx8G7U zm+x+J>=ie~)1-J#xjgHqng92MqB)0`zhe1s9nJ?!D8?poL~L27i|(A9VpK5SpO+}` z{e9Lq@cloe+*dBy8IPDd7X^inG`NHHNb(!G43;47AKX)JmuSHuzxTT;V(ePmB~wv$ zhn^>Fmq6S}M8$S#8i?U`i)fBx^vpy1ICdqn?Gh+uKTlM2rv4TvIl7?ms<%_suiMA* zV54wKt!Pw2F;F2XqQVbHZ+2>Kif>Vjmz7TFXQ1eJtWf1o$GQKHYzdM_wBiGsqb z+D%oxZLfhzfnuvN?$C57hW83Za|Y|wW;S=F#uE3Rm2n%@tOjcY#avaoQmJ=lxW#>j z;{K^JZli`NE_GG3Rn%y)~sm*QTcj9WhsMgOp*h^m@S*s6M6C%@;&ev96joMNnH zaX%+fXuj++I@9d+Fo{sSq^w8iGf)h_DV*YcG@sncv-go}4s7lO z<$*G8V;!rgn;vtc+WE#&M(qtrWWdfKf{O`NGy)5oDmd0(%{ah!yV)@0(bsKidBTeEnj?3qBF%ku8J7D)}Dm9GeQcMJM=tZ zPXgk7Wj#Wl12O!%MKs4TdS;np9J3r8M7DzfW$tULGqtgS)nkRA@KLvn>QQ4K$A6h6 zoKh?515oroloTU9p;~m5(J0a%H$tlM7nG=g8 z3OdttA_hwH$EsX1*)Nv7kzY`ntQWJ8~}c%&Ll9x|EdA4CE4S6}j;F zriStu_D5Ei2ZCbG7?lZB>0|avo4FwFJ4!{Pp4H&nk|JtQPTkn# Gruc8Qhd_-0 literal 0 HcmV?d00001 diff --git a/zktraffic/tests/resources/zab_followerinfo.pcap b/zktraffic/tests/resources/zab_followerinfo.pcap new file mode 100644 index 0000000000000000000000000000000000000000..f8682134923af243935e6956f861e76eec538fbe GIT binary patch literal 4442 zcmdUyT}&KR7>3U-yZkKMB1jF|-=3^Vn$2|BDRg*7y-|(~N@H=hu%4Ic-RW-j=&8oA%d%A}) z5ADQKG<^A~EsxU4q<4CHU17}YyZ@8Vn;R$_JTpw+d$O`}NO?Py!}v_wytwktz8^{X zi@$|(G@MwXQ&2CC6*KndY29DRu*_d{3#qJ43YEliH2nK7d*h_!;BSn+7yiOfmiW8I z{rx4B;cuD#HPrja-%N}#6;+-elKG3|k&5pVp^{jMhC9m-oFb(M{q=Oy_vDY1zmzI7 zM#@!lLK*&6^4?W8L%l0mWbaH*ciCW1w@|(Y<^3ShHZR_pJ&^$SJS&t9&s|V2=zYYa zt?z_K5A|DDC9mI3%2LqANpbn{jN*-GxMXS9R$@D(z`G~B-jpgkq;R9KUcCkNQil}c z@EjM)Y)Y1bmgJtd+dP*-{kAOyu1YEFpZ2rksEM|D@mvo@@_DZBWEAyT&~q(8u9zqz z*M7*F4(pC$R`$;kDGg&QKiWHab z3B`ooQ9T`NEd!J}>^jxrajIn-$nLc$yp~{{Afp!Q_-%B&##RfF2dI{hfAF(LWpM#n4FA8g_^2eCX()lVdGWcZ)h77_=7}tf znLdn}zJe@{tXE~`B84o*ppb>lXMobCMTvj-gp3l|OcY--L($(bvq=5AjWPks1vg65 zX&FW7AWE=OP>dPBf*Eh+ech;K4wMuqLA`>FpHz#SqH;?5854!3=Q^h6ssm-hjiU9* zYSE^6UvdS-=u0d5vS>?e9<|K5C3Zwgi4^d@jAtl%U#_B_yEe*#jI!`#j^w$ib`m9h zP*9Bb*j*&{tL?eD1j+*S;47)3!WDxrm=y7@jV+?n{SJ!rF(|(LrYvveB%dAITf|VL z=VNAe;*;<=kG%cZmU}>yl$4@!O4|NL*OPdVvfxHpjLT}#F7nyQ5$PDS(~pE!tzD&B z;*(|yerI$WsFpuKaeo^sr+8w|3yN{uR?&m^tUb^vbx`b;`c}HQV%Sm9lFq<6yKixW ziIS93R8C3nHBoSXLwT6SJJ$QlDO2Wj%#?fbn^j1)`0RiG+ySZ7+Jk|?vcZ9KW{T*+ zi>PH+zpT^h>qJTKw$)PFSzeoKt>tVdD1&B-sO7&Y3a143m?*eybqt-Jc^JxTZ_8?l z6!F9of};NoTAPc+Le|8nmb0DaTFi+Zmr}G#L|OJ{DEj{oW>8P@!%)USalaet8Qzy? l1x0`2g+l1dR_oo+YoQ*bq>2hx3?48kQV)vJgUe2e{{qtC0bc+B literal 0 HcmV?d00001 diff --git a/zktraffic/tests/resources/zab_revalidate.pcap b/zktraffic/tests/resources/zab_revalidate.pcap new file mode 100644 index 0000000000000000000000000000000000000000..b80500e760a8569489b1518cbf00a65ff1701b23 GIT binary patch literal 5667 zcmb7|O-x)>9L4V-gHW4FOdw$O`Bgu=U~GJ|}V(JGYy6=TX2T2K_lj-M=y*fdrY zoDE=OX)HU_WEQnxwJKIyR32R!bYkIx!hzZI z8?t6Qr<&%va{@aS!}QNU`Z}wvVBTuWzljurbVEFSNnD_8G*axHpv0a~D3`K(ceP%b zY5vs@R8j_JYYMT)`3>0tqBQBd6wIr;&})Wuu*)f;l+)k1)r&j!0Q(G- z@Onvc9Lo-LPDO*=ndI1gs$&K7P~3AZz*qouVe>;x#Ge-#R~Re0}%^0sjos}mHfL{gj{MT11j(tCtm zil)_F;5GKaE^#9zegKrjJubybeSvc5^FtXnCe1zvCA>~jL|e0{t+{&A&MugH)Tn6h zf?}*$QABt8uFSM#dMTEZ;?48M?lg17$2=9aR6~<1{g&NXo5H>TCG?L%L3bP{d{B-U zcd=dq#d=s$M0awDv{_FTyM!jGF7Eq)Ui0o?mr0@|fB&+RpoG&UMWni!Qq9vda41kb zYn(g&E))}YOGW1lYRRNzhyBc*x?q~yZUH40l@xLA3{!VDdCgrxb6+&h&Ax9_0-D3^^CdpDo^QH6reJ9GP>d`RvjKSQm(pjgF{BD#}D`xNULl#Ezy zCC8~QtGa_-&KfgdUx5-%lN8aNV(Lzro&l$fK=Ef%Y#|(O^%Bpo9w;Vqq@w7~CUR($ z&+R_HJm+5Z`~va%|BOA_!}HiFiK0iN)T2tT9V*2R$-QS^Loqa`D56J>D_X)8L*)Gk zx!`&)djv`q&7GWL#Xzybk|Gi=BT}uNFenv6Dh0lS1WKpT9X19^I8{2s8Hhn}>v z3+DdQsK`!1F`S|(B7;_XXSF9&%sZ57I6JLZxD)qFMR6juyH2=gXJm`;J56?mykB*8 zVux}fCU=E>%Xi@4_COV<19s@qcK|W61&T96sVqu3-0H>8|62AP6hqT;2Tc*ptdief zBKc4x1$BoE`TZq;#eh5XP|&b|^(wdQafuU_^^j%zXo05XFJO^I!sTxz#hyjev23?P zF;*!RwW4Tmt!*7EOE1F!4X2b4A=h5f+i{@rtK zAC!!MX&0*t6zf4r5hvL(a%fCX6}!|Gdvyo9 literal 0 HcmV?d00001 diff --git a/zktraffic/tests/test_zab.py b/zktraffic/tests/test_zab.py index e4c6ec0..6bd5493 100644 --- a/zktraffic/tests/test_zab.py +++ b/zktraffic/tests/test_zab.py @@ -22,11 +22,14 @@ from zktraffic.zab.quorum_packet import ( Ack, Commit, + CommitAndActivate, + FollowerInfo, PacketType, Ping, Proposal, QuorumPacket, Request, + Revalidate ) from .common import get_full_path @@ -35,6 +38,19 @@ LEADER_PORT = 20022 +def run_sniffer(handler, pcapfile, port=LEADER_PORT): + sniffer = Sniffer( + iface="test", + port=port, + msg_cls=QuorumPacket, + handler=handler, + dump_bad_packet=False, + start=False + ) + + sniffer.run(offline=get_full_path(pcapfile)) + + class ZabTestCase(unittest.TestCase): def test_basic(self): payload = '%s%s%s' % ( @@ -65,16 +81,7 @@ def handler(message): elif isinstance(message, Ping): pings.append(message) - sniffer = Sniffer( - iface="test", - port=LEADER_PORT, - msg_cls=QuorumPacket, - handler=handler, - dump_bad_packet=False, - start=False - ) - - sniffer.run(offline=get_full_path('zab_request')) + run_sniffer(handler, "zab_request") # requests assert len(requests) == 3 @@ -120,3 +127,48 @@ def handler(message): assert len(pings) == 57 # for such a short run, this numbers looks too high assert pings[0].zxid_literal == "0x100000000" + + def test_revalidate(self): + revalidates = [] + + def handler(message): + if isinstance(message, Revalidate): + revalidates.append(message) + + run_sniffer(handler, "zab_revalidate") + + assert len(revalidates) == 2 + assert revalidates[0].zxid == -1 + assert revalidates[0].session_id_literal == "0x3001df405ba0000" + assert revalidates[0].timeout == 10000 + + def test_commitandactivate(self): + commitandactivates = [] + + def handler(message): + if isinstance(message, CommitAndActivate): + commitandactivates.append(message) + + run_sniffer(handler, "zab_commitandactivate") + + assert len(commitandactivates) == 4 # 2 join + 2 leaving + assert commitandactivates[0].suggested_leader_id == 3 + assert commitandactivates[0].zxid_literal == "0x10000000d" + + def test_followerinfo(self): + followerinfos = [] + + def handler(message): + if isinstance(message, FollowerInfo): + followerinfos.append(message) + + run_sniffer(handler, "zab_followerinfo") + + assert len(followerinfos) == 2 # this is a 3 members (participants) cluster + assert followerinfos[0].config_version == 0 + + # Note that this is *not* the same version as in FLE (which is -65536 and a long) + assert followerinfos[0].protocol_version == 65536 + + assert followerinfos[0].sid == 2 + assert followerinfos[0].zxid_literal == "0x0" diff --git a/zktraffic/zab/quorum_packet.py b/zktraffic/zab/quorum_packet.py index c1dc393..8def29b 100644 --- a/zktraffic/zab/quorum_packet.py +++ b/zktraffic/zab/quorum_packet.py @@ -273,8 +273,7 @@ class Inform(Proposal): class CommitAndActivate(QuorumPacket): PTYPE = PacketType.COMMITANDACTIVATE __slots__ = ("suggested_leader_id") - def __init__(self, timestamp, src, dst, ptype, zxid, length, - suggested_leader_id): + def __init__(self, timestamp, src, dst, ptype, zxid, length, suggested_leader_id): super(CommitAndActivate, self).__init__(timestamp, src, dst, ptype, zxid, length) self.suggested_leader_id = suggested_leader_id @@ -282,8 +281,7 @@ def __init__(self, timestamp, src, dst, ptype, zxid, length, def with_params(cls, timestamp, src, dst, ptype, zxid, data, offset): data_len, offset = read_number(data, offset) suggested_leader_id, offset = read_long(data, offset) - return cls(timestamp, src, dst, ptype, zxid, len(data), - suggested_leader_id) + return cls(timestamp, src, dst, ptype, zxid, len(data), suggested_leader_id) class NewLeader(QuorumPacket): @@ -330,8 +328,7 @@ class ObserverInfo(FollowerInfo): class LeaderInfo(QuorumPacket): PTYPE = PacketType.LEADERINFO __slots__ = ("protocol_version") - def __init__(self, timestamp, src, dst, ptype, zxid, length, - protocol_version): + def __init__(self, timestamp, src, dst, ptype, zxid, length, protocol_version): super(LeaderInfo, self).__init__(timestamp, src, dst, ptype, zxid, length) self.protocol_version = protocol_version @@ -339,15 +336,13 @@ def __init__(self, timestamp, src, dst, ptype, zxid, length, def with_params(cls, timestamp, src, dst, ptype, zxid, data, offset): data_len, offset = read_number(data, offset) protocol_version, offset = read_number(data, offset) - return cls(timestamp, src, dst, ptype, zxid, len(data), - protocol_version) + return cls(timestamp, src, dst, ptype, zxid, len(data), protocol_version) class AckEpoch(QuorumPacket): PTYPE = PacketType.ACKEPOCH __slots__ = ("epoch") - def __init__(self, timestamp, src, dst, ptype, zxid, length, - epoch): + def __init__(self, timestamp, src, dst, ptype, zxid, length, epoch): super(AckEpoch, self).__init__(timestamp, src, dst, ptype, zxid, length) self.epoch = epoch @@ -355,8 +350,7 @@ def __init__(self, timestamp, src, dst, ptype, zxid, length, def with_params(cls, timestamp, src, dst, ptype, zxid, data, offset): data_len, offset = read_number(data, offset) epoch, offset = read_number(data, offset) - return cls(timestamp, src, dst, ptype, zxid, len(data), - epoch) + return cls(timestamp, src, dst, ptype, zxid, len(data), epoch) class InformAndActivate(Proposal):