From 6298b780ae83d5643b79f4133d680fcec10aa423 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 11 Jan 2012 18:38:16 -0800 Subject: [PATCH] Move network stats to FileRotator pattern. Split existing network stats into two separate classes: a recorder which generates historical data based on periodic counter snapshots, and a collection of historical data with persistance logic. Recorder keeps a pending history in memory until outstanding data crosses a specific threshold. Persisting is handled through a given FileRotator. This pattern significantly reduces disk churn and memory overhead. Separate UID data from UID tag data, enabling a shorter rotation cycle. Migrate existing stats into new structure. Remove "xt" stats until iptables hooks are ready. Avoid consuming Entry values when recording into NetworkStatsHistory. Assign operation counts to default route interface. Introduce "Rewriter" interface in FileRotator with methods to enable rewriteAll(). Introduce IndentingPrintWriter to handle indenting in dump() methods. Bug: 5386531 Change-Id: Ibe086230a17999a197206ca62d45f266225fdff1 --- .../servicestests/res/raw/netstats_uid_v4 | Bin 0 -> 156516 bytes .../tests/servicestests/res/raw/netstats_v1 | Bin 0 -> 18742 bytes .../server/NetworkStatsServiceTest.java | 75 ++++---- .../net/NetworkStatsCollectionTest.java | 175 ++++++++++++++++++ 4 files changed, 217 insertions(+), 33 deletions(-) create mode 100644 services/tests/servicestests/res/raw/netstats_uid_v4 create mode 100644 services/tests/servicestests/res/raw/netstats_v1 create mode 100644 services/tests/servicestests/src/com/android/server/net/NetworkStatsCollectionTest.java diff --git a/services/tests/servicestests/res/raw/netstats_uid_v4 b/services/tests/servicestests/res/raw/netstats_uid_v4 new file mode 100644 index 0000000000000000000000000000000000000000..e75fc1ca5c2e6c01a907792cc88faeddce61f1e3 GIT binary patch literal 156516 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%0AD28Ii{yYQ)pVMv4WaGeFp&L$^ShvF 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 literal 0 HcmV?d00001 diff --git a/services/tests/servicestests/res/raw/netstats_v1 b/services/tests/servicestests/res/raw/netstats_v1 new file mode 100644 index 0000000000000000000000000000000000000000..e80860a6b9599fd1588a36b77b95a8e90a003efc GIT binary patch literal 18742 zcmeI)2Xq_fwIE>Le`e6wo7g0(T9#<_W=rmt{cO2Mj$9JQj$0DjaqPsgojAoH0g@oW z-bt{NVDBW@I|26I3HIK5Z{S`ENsjh7elNRk&)IW!1D*LWoEZRv!OTDZ+g?#yd*e0(PS&7$6#ll)-+s>YN1 ze}{Hbb_V++{&E%Nd3b*;<_d5BN$901-2Xt5W6s@w!a=QiOhbe7&(~!CH9s)x-Zg=L ztONW7U$OsH|Hd=>WBY&Ko%Z+dzCZs5zTo~MKQQawPvr1tLe}xSSC5y}o#ac>s?pk^ z_4?GE5aaeQfC+TC)~ z^7UD5uPCy7W`7!+t#1Tc=S}v<^O<~R*}%@o21d2z2k&lFoUdm{bT8bUkIVf1vA^p3 zU-Mu53cz>VY^mM<;b2dH-(GrO&OSD*e~jYD-FN)QM%4GVREWP&U48N0U+C!8MluBTcEe~-H$?yK*#@6C@o#H<=HuYe;{#bLDTpG) z5HwN+qwNJC^HV?s&Ktw!0vDCwU(pS*y%msGLaI!A@%{acQd+TxBtVj1^oZCUL<^c|V9*|LgEGAg9Km}O~yopBw*NiLM-i@vQ zBEXTen?D8qQ>^H?0eixadjrR#I<`mrp<+=9Ix$>|DvIQ2xTGB2TdP37f6S|obM+A} zPwBvA!koHL)wmMvF6%+FL;6tf?S6EreGqL(8%7gcMp1{UF?38ZftH0$p`p9e=x*mM zs?3;2v)mR@ubCxuv0??Sk61(1ZHlOS6URq0x6x9MT{L7)h3-`Gv6bnP+Mt=%Le#U@ z7G21;N9(*C(6|Lh)V|gU9f@{9O9XCcaKAgco$HBq`go(VB_GtI-VdFR4M1yc1JT&Q zAk?lP1ReGZLyK3!(R*7u_o8^5G8d4D)~qF=G0iEcZBiOKgE(}qigIncjVS6R2KEG`^*W!5FWF4BOXh2=Vn$Ve@ zX0)oa6^+VhM+I)3=)iOrT2RrA21N9t>#9DqRXKpBW)7h)9wX@V>?m4UHI7Q9lc<_377zH8oSQ=&hb3k;|Qlmt7qI%FSn?5wNuOIcy9Yhzrhf(#}RDB*D z5l-Qhl7VS7IDZ!1_MJyNmlsf3!xHKdzk<%&t)c2(Qf%QSj@t!nqr`{*!*QvN0=4NYNBeUs z(R}Y})PJ!CU8}7_Q-n>Z^FT8ix!i$TH*}$WaouR1T`$_~KZGW)4x>&@qiDHk5{(#{ zLL0a3v6qwB;ea}(i_vixXH-7rf`*m5p{g(sG&Cy$-Sv>7%DE^st2zetii$%QtrO7t z-b6G$Cm9uar=p_^X=rI}1{xBRiS7up(XRd+G&3&`Rrj~<_O$qMaiuuL-cF8=3@Xr) zf(rERl>~o#r5eXO8*5QnLOtpsYDDLUo6y>#7Bp7UhT5&Sqr=UeXmOGf4RY*3w?=!> zyZvr{M$jOR$2d)(wiA>4{XBTq{nyP^bZi(@EOEwVCLS|-B@yO%eJ9%7j)}@G!Zx|> z%Vv2#yrK+VVbag+Y8byjCM;XmS_+*`r1JTYAZo@MW@Aa}4EWS=oSJ#dOU6}u^lqAN zY>H)jn3nW*Lx!#(fVJ)SK*GM#}T zBilV=&ly%ys8&Z5%iWr@9Rs1St+`Oq_9jCv#?~u(ljZk~Nv)#%sHH~OaiPMqNPY!r zDI^Oq%uL3iu#iXB1I)tOICg86*5&sv4jP8k=?y1X^hpntE$EL+j&IfKgt$HA?WZsG zpgL8Qa);&r)${~J#DhE)3O^ZE(7B;Z^ORnFnodsSecllUJH4jTPEMr2plMiZYLKjm zjJ=1Lp*}57m3fVW`Ccx|tAf2%&+JaK)*_jnKDPe~t255LaOqfUlSNjaaZ#IDw5Lhv z62lkjS$kLp+M7UL7TMo7rQS;uEhZD{*B-{Fcq6QQ?JaxjxQ0u33E<_~_|;Fk(% z&+pB1ch_DNMxCnkCEFrOP(@k9rd~-vf1{ zI<~tUk5UU^td7c=32HyG_>p%s%V(8wkh0chn1lt!HJs%#%5simEpKbO*_up8>g>3( z_#LKOC5H2(yvjCuxt>=fV=ws~aG%i(_BQLQ;WeqK)Lh7#0cAY6mOxq-*>-?(FOt#< z5w+ZwSaVSZyUkwPy_xDBXFCP*=7l`lEOtRY<$8D!M^8;JC97bU<(15?v1e+O>@6QwXfVfa!lY~d^m3qf zSet&AyLJR#`@*w6##ya-q+pv7|FUD|dQ)pKRh~_HwETOu(~h|Me7<1q3(7f;^B?__ zqK*7I*e;hB2d)pD2;bvYGMP4<_H!{C?BcH%J&h~Y>FL)aUfF1QK(J$3lCI@s)IM&} z>Iptc?o4HsVNCoOoswBa#TDt>J(gf+Ap0`COKbcA+bv$=AInFMZhY;yC8ZN(nv+wO z8x5rWPjPmz+{~W5wc38)h_il5o$h!LTlKVXhuiaFmVi^71_9NYL3XfH$&0l+C>)E0 zF#&8Zwu7WsKceB9V)}4x(Fs{#B-NT=4YmsNEY*Ga#agME^P1(i+uU{PY`KCxZFimi zMXqvy{H`|-^5$&Gz`)_YdPfrC&Rae$ z7ISO5FK?!3uSe2BZd$gZWZh9m5Kj4q=r>P#lJG*V>LZa4x4&Bk11mghv!$dvAsK&& z(RXUolpD|Thp1>N+gqnw%oTOS(R(=@`}>_Y*_E2R?c6eUdmJ}#m*uf{uEUp%_UPDN zw4eKHZd5ibs?1z%8>sbKF)R#H170vuK$U!E`{S{j_BTC#l&vY;vMBU%yDzIPnA!{? zwee)47}B-Z(l(gFlM=1CB+b#5F5Xg^n6p+#hZO7d{%)WSrdBOt=SkfbY3m^Yt|U=F zS8S4)8M3`eM1zzcAC{i$DunuDuG^635kXW#mW$agFwzPt8zNnf*OBzSQuTzFw3}&o zu~kg*cSx6jQqGgqC6ZfC#V*pa6l!u7s-?d!@V+o~L9Qx;;?dJ7zEG+^V34jIpQr8q z)XdinSLP3{TUfu$x0-)YmH=@&xh^1mEKYSOVa=a77J)3Bn?1tu&89`6u=aR;I4Lss z*dB%4%5=Smh>H!LP`wfb*@8{tVFOKPTEB47-4=k&X9-!PX$rP7Skh34RFT95cc^Xq zd8~-8^t(3qjiP6Q&Z@yVB^A(_ybCQ>_Ir1_yugpPJC#Uh|GMQ;`7PH&{Wq6*MV94X z+rQ&+se~tWCq<9iAD^TBieN)Q@p~y{4wYt2fk*Prwo|9Z$oXkv>_8r>U_X}moE_ma&wco0 z7CfBHQP4fq2AuIGM>^nfKk{%Hac8X@x-n-~OgVEEtYOCCMzsDc6~gK!*e+g+B?B-{ z^cUdzFj&?Q8O)Q1UKW#g(&-6~EqTnI)n)EW4oiuM6+zX*81aN0Dgzp5k27)PqAw91 z3?X{GI_ZW7Jcv>J)q2p{0{QhmFd78TJZSbq4#+r9Ra5un9EdtlPp3ZAW%TXy0dVoS zrNwbh7_~l5jXwO;SLd}xUN+T^An{_D{4|9W9=QE;CpreAz#D$A02w4f7?irel*nk;|=yms^_2j(mXa=?T8NUKHNncGJ%^G=_;cDoW@@PkIvNdrId z(R^t5$sY5y(=Qc5DWpRru3s+7HFPqUU+*ze z@$xLUIj^|!j?ZXj`NER!w2t0~d60)+!3Q$&pNN?@QBl_ibpi>75#d=;8{|v1G9{$J zVlqa@*@ZhdPKKzc8gMcdZJL&DY05%rzmH<3pXpA3wuAf@w(KYFnXpDC3n0;WDFref z?Y5?7-w(L0JR;m_g7tc)KuAp(#7Ws<*V2UMAzi$65ogGaUENNLPbZf^?agKh5t@bP z!PbrKX^yoWG)Z~bX$Wwj+ulh1(fU=D1B70!FW@E4Gbu@QY6wX@Z*4=OFGx~g{f&iU znE8=+F%dbk63P#S)q#H#*KUD0w{S{aIP0x+=HmUcdz#HnWTuenk0kvod}^3aDUzT% z4-!*})0LMmC6iH-)P zLN?ofz*trUGqk-8;m_*yCP0@CHbhHA8UsoyCKP5x(A>fvoQD-_mRl&qZy!vv(MsrI z&8`+eqf}e=P2F#EY)H~WQRn?%s4$&4zeI}Hz;o)Ci4kXK&Io!*uK<#-CI^}e9ANjO z!d2Mpwv^7BOLJLm(g_l?K=u+Lc7@DukezrU-3I$iu!|&p`GoIAa)XFp5=jXG*`Yiq z=>4QC0vcj3G-Yu-JoVf*VQm@w?2ioDa|SOewv58gZ1j?8U(zTggT5rzft1&hnIckL zLn0fAs#CXCkU|y@_phEEvDR-DQS)@9xssAcavLlwpARx`;FfrS`zNmE6Xr9|4pGiF zV0&~th*G8-Ik%HkB~`yk#y5!lEQ~xaUIM#wots7~kK<$Mn%*zWY?>9iX+}CwoMgt-&-r`lPyKQwT}S>| z7F%^7oU?tj@qqAf#>thZ-Sj36=ImhhDapY^-t4z!4@_OM=GOVZd?;OHO-tm|Kt0u% zODVglY%#TAIBFsYFpYA)TBCX@R(dExaMXKFQ}#-RyJo_(lXm+4rH9KLwZ(Zlz1;OO z;8zpJULtBCZX0Bxiv(qnoGtd&yvevHllWHs6wfw|<&B|Cc=lwkK`a~|&~!8UhUY;J z3>Xe+&X9+P0ze5Sxg7I$;M9UiHJlbv&!0XbJiJGF5{`m(cIjjTwQL%w-%1_d0;>vQ zI0zTg*bmp3_d*nX`{z$4!SzH=6kSTWlQVO0qy!%BgKPdIlPNHNqF85^bg*`rU8>(o ztnEOl=rj@;4A0F$J2ViTdbnHz=I$gG^2pVvhv4l^s*v3Umzo)S-a42Cks@k`ltLM? z1sf^=>S?c&B63fMhEs6Yq;8~8K| zTVE&e!nW=?tLMx=ayv1?8Q1;#i-lJ+R(eQPH?#_M2fhU4_ zpJ?gv(&;0Y4{IGiX>9U1?;(?QD%bSgbh3yqdEwx%3|9?fUy0>Dy=dxc^4UQv?tNBQ zUTB4vf}qnR%)l2Uyc-*bmJJgQCF?()#(R?1r!BP)TAtw=oO<{G>((J7)+_D!bCp5? zUhW6Gy|Sb*BsN)`Y;*NK!K~5gXfBJrpUORe#}Fw zk=)%E{>$L^zZduyx4^ww0_vZqFz?Njo%>siUme%KHwJ%itX&=LR!5`NQD=3$S)Jih zM{U)ST6N4-9Ur|nGOCV!-W$4z}Nl*LFBnk8Dl(r|)P zSClM`am@j8&^_wT+B{Sw(foHT#}T3Z8%hNdpjAOMsG z4}dT%{4|aRt-0UhF}(Z9Z+e{)A^1MMei z9Rm1|$7XaX!hoedq1hS?&1e&#Ihuw9IG|-p1I02>ZvcGR|I*{{JNf?ezm$ysM_#$g z6kh_<`(+2f-lzSa=aq35Zn=M2i*WDZWAnE}nL3?y@8R?P6qY(|<>Z@$Nt=6V$?miSa|}h?OQ^43K|6`JhfRsM8DTgIb*yxHlp2LrDO2IA0xxR|nMZ4WHi|Apd@7 zT-`YQD*^15m<9|&-y6oR@NLH_KNQUN8|uTks|5q-_XFFL3FA2Z-Uf$XJcCnuC39%* z`aJ5}vWTuEEu&42t7y{L8Y(W`KqrE>P{rmp8s4^x?xpOZJxMip{m)!i(hM52~p)wG4hzv%@_CnCI?l4pxbpOu->h}iG|6WjH zQ_*TZ-^p@%&A!#JrtYx;R{?~-Q|Ib`w@e|pD;;_&!MT9tGevp1+QZi5!TvU_W(Tu6 zXT9VdZT}`tsaSiUhf3W3N|pwVB4^0$cLTn=2Xt6deLbyo5C3@Ek>}$LLyeeNKg{E4hley!S4>==WN>q;LPua z(sfU8b1sLnf>xNW{9Rqm&4IFKy<3D(T$To23*S2X3t=X?66Wx2`fb8NG*bhi__nT& zRnYF-0^^%)Fpu*((>`jGzAkOg0e-}-xE#(Xh6|NY5o%etUxQ_%vP>`;?1!E>D7-OP zO+}YNV+K))uG>j}e`@nYmhpUxrt8^}AWlInk>?)CZK8VJj}#sfYUPa_oM27Wu$}$b zt+r;_WYWk%Vw~!$pX^K9{xPNVKf%Z`2#*wGHR^O|5IxH9FgJAj{$>EHr3Tup3J7127e|U8O9IK(<9o8ds-Mk?z z3KlwboV{9L(pj^+m0Q0voJ*Zg6X6HwnI!Hgx9!0XR+3FETdd!jrTq`J#FYAekV7;4hj~I z<;BzCQV>2c#0d~U!2Suw##HykH%`RC{l6CJKOR7i? zLvxj^dg_Z~vy6oSm=tS0zIK$m z_K_1>rXRM_Q<|Cjhi+d!$2&C3Ea?qvfA-!}Li)~yYC7AhkZQmle=<>+bhF0vf_NWf zfii=ZhCaNwkb{5{kR(`#Q4)A?*d&#TB-12DCxPiU478AQByjaU)^m5iio3b| zknc~%n<)8>1V0jUztR=j1r~6y2s-Xz2>FaT28xA{#5Hl zp<&f`QTwHCHs-qT{PuV{ocktKH_!xhc-_P-oIKjXTwY+YIlgRWl&&N7ELzK--9-KM z{$iH7796hOUF7|8+u;1EN%pI$@TiNXKP=P4j;cLau9HDSEH?nI(sx+rct_9an|@nH zuW^(0PJa00C7qKAta1G@ZFl&~kHYAmUap`Ut$L{r!Y7qv^*{#OPCt$JRRctjCh#Dx z`k62W*)RkNR5;1SDQiS}XwtZqQjlFTtgT?yj6%%^IFay#75An6@<ZJbkmajZak^g@!BN?Q!frmF*WhVRNRX*I{vzS_os)!;xZ{4f3J1+_W_bO$%javZ>;-&nx5+e6RWyDDqd0^Jy5|O9XKuD`o?ehNJZ+M#8@VDn^PcWluaP2 zVyRLuI4e9Ml>g@Z+X4Mo#~X|*L)gV`tYPt^Tbs`>Zs_$#9Y{?ybW>hm$=4|r=q5LC z@`st4TrJ;zZb#EaC+o{qrtbUohEF76rRph-S2Y^x_6ag{Brp14+pINYXkH02aXYLr zH~MsC_R(G;WGsQZ0GgeNQ~+gvZvL>)6QplBnT3wfIh?&Gy$guFiQRW85Hz9HY&m;= z=W2EZnGU2oy5OOH2~pkRv+ao@ja0bNvMc%8`H#=W(SFTbmzyz;@M_43Qj>0Pu5aw? zj&$RGHSZI6K!OHd1-^#|tb-l{932g@PABV~KfL^x*Pgs_$BJD6%;`_Hp9L49qi-rE z67pA#Z;rE>K&S^ZE%SM31oQLcxYjW7)*|~?Oix5;W3U=dd1;;MVlC;$e5EkRbEk4# zbSsEPBd_JK3r`VdDp}|BRuK0ta4vy{R#*y#?f}@p_+k`9-tN>YXn_{3?5m!AAUB@M zhd%@@K$yvvMdn$j9;kPqla;`y>KdW_#T+I961TC-NT$#B9TQ(udJ$`PYV};of1FA% zuGN>hQhl}Br-HTj*Ncr;x-6jC?^|pTTWz+6rUB)lyUcq3FK>w8&WksH{vb~YEUVA- zeneb}fq{jDgc31;Em(2s1n7a|`j&eb$vS)u?$?_mBV5=o3x5KK|L)`7hUmY(ScRAV zUAOsvtZwt)6`TKg#pd^e1^=$z{CD-{zpFR@->%;Lez)_7!e0M+z)KyX`q#r!>Mr8{ zAGMt?IW91R!sB)()#4Mi8^ussqJV+rSZHg&>q$ipq`DQuY@`H|R$@R=l>@H*ji5~a zd^9E(Vtv|SyRsU>gmn-k$bhY(co@O1tw<0K^2um$+=+y+v}ACxDTlC?d?@s+fYG)v z@bifT7xA~^<=YiIa`1Mqhn_+Sc>7=UuQ{4GlMkZ4JjfB}K!GDBYz0~1won0rof=r# zN`vN9ERe9zf!^-N`JxbrsA_@jbOl5$@mx0z)>Cx5=XH90l3~av8iotKKprcDc)uj@ zUy(y%dOr9mb6`N8h7p)_*cwj*TTwF1w1z@$jW={o6hgdp6S%HqL3MN(?D;0bjJyEa zBJ)7tTneJB3fQzxf@yCBtSG%fg{vx&bVA}7hTyvDAg3}G^0P|8IxhnD#90tz9}0gShg8rm3sMx564bOOJDSS=nQVMgKjZi5l2VrJCl$2g`4f>7$WAm35v#rEsbs*^} zhC%Nlh^Ui8%WOVm*jItOZ654&<$wbQ4iYPqpj+Szo}oz)9i9qyxdpJhnhz}^8RX_S z!R$&kgg2&xv^5M`w;vDM=zz4vU}z6Xg1U$tn6GSw^!R3|TquEg*F2a|I)Jn;58{H; zV9dJ$=DXuyDlG>BmrFnuCx(`-Vo**sgKQW#M^6R_lM^8|G9Hxn*`SihAf*jUSH>bi zGL#0vczskOlY(_&5==_+pk_1$A}7m0VgDzmn)fB05||pW+VQzKA&!Mn+Y-pAwJHk| zLO}yJv+^g&WqFX>k^?OZ*)TVo3R`Zu(A1a+G7n!Uiq8daK`vDF<-$N~EaU{{ff_8gBtr6lTdQnju$I3X^RKFqP{8 z{7oB3oA|cdCm3S3GQiVI2BmII&=6b$CF36jthvHcLKW=dO0^_4K_c!XIc^H@&5nWi z!IE!8wzmujN@m3^Hef8jika-xhKR9Vd%`J89W2aU}v}t`eU-eHlP|3;>#ev zEfrF-aTgt~g3inwSj@_XvcUxC4-$hY|F2DTZ!WD}i`mxSOfm^>F=jW(XM9|*xA)#3-t|m~ z?`_uxswVgSeA{YBYN!N$Egqqs!LaI73%Rv-+fg!IF2=QtJN8FU5t=YiGy{$IA2_h=GAfc@W;#bRHA+!>dzGWZ?R=`M! z9OiQ>F#1{uDFt|tD8hjsPy?ew9?*^Dkqa_R=D|y)$xwJa!htALNSqtxTE`j-XP5q2 z)eJLVX2o+I)@X?fSt*6=DgDek+IJeZ+E`u!i2t4YHE$nk=620C6Y+3YKEU^ZWCDs?fJ;q zwVXSi7gDV%vSI0FN0DYyxPEmnQyotn(%JqBrrtrbPsykTiB}=U`3eSLy^!`9BT_pi zHH_u<%I4R>xv=;v=||C@J9)6y?adqFc%_Z>f}AU;Hf{2vgWE`})TpjSOA)I%)C7Hf zv|Sl@){S`lzCgh!189FgN_4G1l#;!`|EcK3z#(W&fQU7=R~^ihfNve+?rbR^KTsTQ z;up_e_Bc@QM;bCHzeQ+$r1h0hv%=qp-RXK}uM?sJe^ixmI5+^39C5FwCSI*|BQB3+ zSk;MHv2ylUoq?c@%+}K0)zn-UnV(?|z2oZ(i=T|~q4E!#Z%%uF>w5wvNQ6v{7d5y{ zd#6*w)1-CC(9cWDZ&ka>nUy?C9D5E-=99E9_@hRvynzo3{bA&*iEp~U8&8CmC@A`% zBY+h88%I{?l;n_}3HH#4ff&m~q$FBN(j7_g2JK`^_KIlvIGJrFVX07cr|1)pUqn7v z`>y+oV=uQBkjgZ@`T@4Rl%29l70=Obmw4{FA#{xr^V4;8+9d8|h(H;d&x%<65X`dxW@o7%&Z=2a=& zP8E^1^7`E1)l!qFvkLR^vm12F`BT`G$nqiJjX&6K!19%hWBwxI-A~!&Lgo@UzZaND zVkaq$?kldp?EFRWhbuM^^RvNkLOv;bX+9ddW)EZu4*7NSCU!a5p}O6x#17ZKg^ek) z&_Ko~)i^6ezu1?%R?Otb(ZwmyI0ow};1dSXi!k!_rmI$8la7D0W~nP{+*>yzjvn8? zo8+YvycZr>z_9H$Jbd#}G3`jo;ME~20{*-PFJ8azowGJ@F$PM=6x9G(B${%BH$5p= zNYSl@(`)d-9fa={o<`&%7Km{e;FeAB$o0ge@?@@x*v=r z&9I6wreFQh6~6rIAEL-6Cy;U>6C{*90pE47HZj=zNi=xUKY2m{3-HsEAD=pX)(FxyLUhTMHDE=HUyD*=!HsFGv&*ua5c7>PhSyH`kx8lSD$|Q$8SE3gebVe<3LNk$*w`ZwL+7B*1 zXm!Tw;v>sD2b#}0rNEQ((Z9P-LYoaJg!WGaS2#2gUl7eKK1!+P$tb+K|dda&lZo7F*yX( z1Kx<;kpS5r4BwP}xOm6zH&L(2#Uyr~$_Qh1J5uEyoRlplBY||`5@&N5fR`WO%Gi9QnGg~Pz6(r9H9faNFC~$zL}sIn z$_}G@mDKnO>22XW@`sg|1x-wJGbQ(+8v4mhAWX|(D1nFWM@*pYxxI!44vN@WC1 zbZa-2u*gIRsYVxYZD#iD7@I|+%Ea66!C%RQM8m?D!J$MrM|PdS@rB^8SMT)RcKfvU z?ZK}`Z0L3@X1x?FB*{yfLG~O6KW>37dmHOydcaymO3NYXHUIav^jbf#f2H|mM-Vhb z=_O5S*}6i%0=%AIJ1ljAphxC;!DWooC@a>U9oRz659`Oe&^^->Kc8w3C266g$A`F% zfNwl0T!7gLvg=1mr-_#%QyxaG37Oqos=kg=EbJj?pJa&0Y$BNmAoW6m%~n7c$@Hg-q;%T`iMC;8stlC@tho#j+mpaSknO;3 z57>nhRRGCbfrw{9&rE$O`DN!{%0Ev$+iDA$F~lZ=?Kw)ySE=59N>xqj9B90$DP2xH zZAr`&84}ZLQnHB&^BgiDr5t0SvhC5k9*#j{A=sGg;}H^lokp|Mm|?QttpXF z!Nc_ICImIHTVgr8quL=URHq*m*iA~`&*WG$1)57b3wqu}p`{UrcODGD=B>B$jt83* z9u3Qc=6+HY0fF(5^PQ7B5mi%x)| z>EJ4IIG&rtA(5GDXOCOcUQ;A~o+I~VIaIQ8Bk19D%2P(XT}YM#>61cFG--Dvj{eNp zGTW_+-B-huF47(D;Dae9cF z0pyTTsvVmP1?2{Bs)#ofX^(;xpM3GkGfzGK(6yI0$b0rwG8B+M-Z=J3J2gpE;7tGi z&yW84+RdAPEhh22F_KEnP!3EW-kN$uF{4<(w9#obhI5 zk~p$R#}i-T&5B})m|7wxnON-_3@(s?N%l#)on1)VQcAqX<8BlE-%Tz2`}P0x7T8a< z{C)U=RLlMgeqh$U>EQpZ|4ql`Y*R9cI1~58^dmXu-4}cIYYjQ;T=`+8_SU5&?QpI= z<~8>}g~OP#EqL_(`|HYyr{((POte)ICxYQ$NZhZ8 0 ? state[0].linkProperties : null; + expect(mConnManager.getActiveLinkProperties()).andReturn(linkProp).atLeastOnce(); } private void expectNetworkStatsSummary(NetworkStats summary) throws Exception { @@ -815,23 +823,35 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } private void expectNetworkStatsUidDetail(NetworkStats detail) throws Exception { + expectNetworkStatsUidDetail(detail, new String[0], new NetworkStats(0L, 0)); + } + + private void expectNetworkStatsUidDetail( + NetworkStats detail, String[] tetherIfacePairs, NetworkStats tetherStats) + throws Exception { expect(mNetManager.getNetworkStatsUidDetail(eq(UID_ALL))).andReturn(detail).atLeastOnce(); + + // also include tethering details, since they are folded into UID + expect(mConnManager.getTetheredIfacePairs()).andReturn(tetherIfacePairs).atLeastOnce(); + expect(mNetManager.getNetworkStatsTethering(aryEq(tetherIfacePairs))) + .andReturn(tetherStats).atLeastOnce(); } private void expectDefaultSettings() throws Exception { expectSettings(0L, HOUR_IN_MILLIS, WEEK_IN_MILLIS); } - private void expectSettings(long persistThreshold, long bucketDuration, long maxHistory) + private void expectSettings(long persistBytes, long bucketDuration, long deleteAge) throws Exception { expect(mSettings.getPollInterval()).andReturn(HOUR_IN_MILLIS).anyTimes(); - expect(mSettings.getPersistThreshold()).andReturn(persistThreshold).anyTimes(); - expect(mSettings.getNetworkBucketDuration()).andReturn(bucketDuration).anyTimes(); - expect(mSettings.getNetworkMaxHistory()).andReturn(maxHistory).anyTimes(); - expect(mSettings.getUidBucketDuration()).andReturn(bucketDuration).anyTimes(); - expect(mSettings.getUidMaxHistory()).andReturn(maxHistory).anyTimes(); - expect(mSettings.getTagMaxHistory()).andReturn(maxHistory).anyTimes(); expect(mSettings.getTimeCacheMaxAge()).andReturn(DAY_IN_MILLIS).anyTimes(); + expect(mSettings.getGlobalAlertBytes()).andReturn(MB_IN_BYTES).anyTimes(); + expect(mSettings.getSampleEnabled()).andReturn(true).anyTimes(); + + final Config config = new Config(bucketDuration, persistBytes, deleteAge, deleteAge); + expect(mSettings.getDevConfig()).andReturn(config).anyTimes(); + expect(mSettings.getUidConfig()).andReturn(config).anyTimes(); + expect(mSettings.getUidTagConfig()).andReturn(config).anyTimes(); } private void expectCurrentTime() throws Exception { @@ -843,27 +863,16 @@ public class NetworkStatsServiceTest extends AndroidTestCase { } private void expectNetworkStatsPoll() throws Exception { - expectNetworkStatsPoll(new String[0], new NetworkStats(getElapsedRealtime(), 0)); - } - - private void expectNetworkStatsPoll(String[] tetherIfacePairs, NetworkStats tetherStats) - throws Exception { mNetManager.setGlobalAlert(anyLong()); expectLastCall().anyTimes(); - expect(mConnManager.getTetheredIfacePairs()).andReturn(tetherIfacePairs).anyTimes(); - expect(mNetManager.getNetworkStatsTethering(eq(tetherIfacePairs))) - .andReturn(tetherStats).anyTimes(); } private void assertStatsFilesExist(boolean exist) { - final File networkFile = new File(mStatsDir, "netstats.bin"); - final File uidFile = new File(mStatsDir, "netstats_uid.bin"); + final File basePath = new File(mStatsDir, "netstats"); if (exist) { - assertTrue(networkFile.exists()); - assertTrue(uidFile.exists()); + assertTrue(basePath.list().length > 0); } else { - assertFalse(networkFile.exists()); - assertFalse(uidFile.exists()); + assertTrue(basePath.list().length == 0); } } diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkStatsCollectionTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkStatsCollectionTest.java new file mode 100644 index 0000000000..7f05f569e5 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/net/NetworkStatsCollectionTest.java @@ -0,0 +1,175 @@ +/* + * Copyright (C) 2012 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.net; + +import static android.net.NetworkTemplate.buildTemplateMobileAll; +import static android.text.format.DateUtils.MINUTE_IN_MILLIS; + +import android.content.res.Resources; +import android.net.ConnectivityManager; +import android.net.NetworkIdentity; +import android.net.NetworkStats; +import android.net.NetworkTemplate; +import android.test.AndroidTestCase; +import android.test.suitebuilder.annotation.MediumTest; + +import com.android.frameworks.servicestests.R; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; + +import libcore.io.IoUtils; +import libcore.io.Streams; + +/** + * Tests for {@link NetworkStatsCollection}. + */ +@MediumTest +public class NetworkStatsCollectionTest extends AndroidTestCase { + + private static final String TEST_FILE = "test.bin"; + private static final String TEST_IMSI = "310260000000000"; + + public void testReadLegacyNetwork() throws Exception { + final File testFile = new File(getContext().getFilesDir(), TEST_FILE); + stageFile(R.raw.netstats_v1, testFile); + + final NetworkStatsCollection collection = new NetworkStatsCollection(30 * MINUTE_IN_MILLIS); + collection.readLegacyNetwork(testFile); + + // verify that history read correctly + assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI), + 636014522L, 709291L, 88037144L, 518820L); + + // now export into a unified format + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + collection.write(new DataOutputStream(bos)); + + // clear structure completely + collection.reset(); + assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI), + 0L, 0L, 0L, 0L); + + // and read back into structure, verifying that totals are same + collection.read(new ByteArrayInputStream(bos.toByteArray())); + assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI), + 636014522L, 709291L, 88037144L, 518820L); + } + + public void testReadLegacyUid() throws Exception { + final File testFile = new File(getContext().getFilesDir(), TEST_FILE); + stageFile(R.raw.netstats_uid_v4, testFile); + + final NetworkStatsCollection collection = new NetworkStatsCollection(30 * MINUTE_IN_MILLIS); + collection.readLegacyUid(testFile, false); + + // verify that history read correctly + assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI), + 637073904L, 711398L, 88342093L, 521006L); + + // now export into a unified format + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + collection.write(new DataOutputStream(bos)); + + // clear structure completely + collection.reset(); + assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI), + 0L, 0L, 0L, 0L); + + // and read back into structure, verifying that totals are same + collection.read(new ByteArrayInputStream(bos.toByteArray())); + assertSummaryTotal(collection, buildTemplateMobileAll(TEST_IMSI), + 637073904L, 711398L, 88342093L, 521006L); + } + + public void testReadLegacyUidTags() throws Exception { + final File testFile = new File(getContext().getFilesDir(), TEST_FILE); + stageFile(R.raw.netstats_uid_v4, testFile); + + final NetworkStatsCollection collection = new NetworkStatsCollection(30 * MINUTE_IN_MILLIS); + collection.readLegacyUid(testFile, true); + + // verify that history read correctly + assertSummaryTotalIncludingTags(collection, buildTemplateMobileAll(TEST_IMSI), + 77017831L, 100995L, 35436758L, 92344L); + + // now export into a unified format + final ByteArrayOutputStream bos = new ByteArrayOutputStream(); + collection.write(new DataOutputStream(bos)); + + // clear structure completely + collection.reset(); + assertSummaryTotalIncludingTags(collection, buildTemplateMobileAll(TEST_IMSI), + 0L, 0L, 0L, 0L); + + // and read back into structure, verifying that totals are same + collection.read(new ByteArrayInputStream(bos.toByteArray())); + assertSummaryTotalIncludingTags(collection, buildTemplateMobileAll(TEST_IMSI), + 77017831L, 100995L, 35436758L, 92344L); + } + + /** + * Copy a {@link Resources#openRawResource(int)} into {@link File} for + * testing purposes. + */ + private void stageFile(int rawId, File file) throws Exception { + new File(file.getParent()).mkdirs(); + InputStream in = null; + OutputStream out = null; + try { + in = getContext().getResources().openRawResource(rawId); + out = new FileOutputStream(file); + Streams.copy(in, out); + } finally { + IoUtils.closeQuietly(in); + IoUtils.closeQuietly(out); + } + } + + public static NetworkIdentitySet buildWifiIdent() { + final NetworkIdentitySet set = new NetworkIdentitySet(); + set.add(new NetworkIdentity(ConnectivityManager.TYPE_WIFI, 0, null, false)); + return set; + } + + private static void assertSummaryTotal(NetworkStatsCollection collection, + NetworkTemplate template, long rxBytes, long rxPackets, long txBytes, long txPackets) { + final NetworkStats.Entry entry = collection.getSummary( + template, Long.MIN_VALUE, Long.MAX_VALUE).getTotal(null); + assertEntry(entry, rxBytes, rxPackets, txBytes, txPackets); + } + + private static void assertSummaryTotalIncludingTags(NetworkStatsCollection collection, + NetworkTemplate template, long rxBytes, long rxPackets, long txBytes, long txPackets) { + final NetworkStats.Entry entry = collection.getSummary( + template, Long.MIN_VALUE, Long.MAX_VALUE).getTotalIncludingTags(null); + assertEntry(entry, rxBytes, rxPackets, txBytes, txPackets); + } + + private static void assertEntry( + NetworkStats.Entry entry, long rxBytes, long rxPackets, long txBytes, long txPackets) { + assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes); + assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets); + assertEquals("unexpected txBytes", txBytes, entry.txBytes); + assertEquals("unexpected txPackets", txPackets, entry.txPackets); + } +}