From a1bb3a36cd0e1c006c11e13598bd9e8b87a1306c Mon Sep 17 00:00:00 2001 From: junyulai Date: Tue, 25 Jan 2022 09:55:24 +0800 Subject: [PATCH] [MS59.2] Add unit test for NetworkStatsDataMigrationUtils Test: atest NetworkStatsDataMigrationUtilsTest Bug: 204830222 Change-Id: Ia6e8aec9a828072a2a1e63bec600c2e20d3699b3 --- tests/unit/Android.bp | 1 + .../NetworkStatsDataMigrationUtilsTest.kt | 112 ++++++++++++++++++ tests/unit/res/raw/netstats_uid_v16 | Bin 0 -> 5151 bytes 3 files changed, 113 insertions(+) create mode 100644 tests/unit/java/android/net/netstats/NetworkStatsDataMigrationUtilsTest.kt create mode 100644 tests/unit/res/raw/netstats_uid_v16 diff --git a/tests/unit/Android.bp b/tests/unit/Android.bp index 2b698fd1d2..aafa46d0ea 100644 --- a/tests/unit/Android.bp +++ b/tests/unit/Android.bp @@ -74,6 +74,7 @@ filegroup { "java/android/net/TelephonyNetworkSpecifierTest.java", "java/android/net/VpnManagerTest.java", "java/android/net/ipmemorystore/*.java", + "java/android/net/netstats/NetworkStatsDataMigrationUtilsTest.kt", "java/android/net/nsd/*.java", "java/com/android/internal/net/NetworkUtilsInternalTest.java", "java/com/android/internal/net/VpnProfileTest.java", diff --git a/tests/unit/java/android/net/netstats/NetworkStatsDataMigrationUtilsTest.kt b/tests/unit/java/android/net/netstats/NetworkStatsDataMigrationUtilsTest.kt new file mode 100644 index 0000000000..e4943ea9b5 --- /dev/null +++ b/tests/unit/java/android/net/netstats/NetworkStatsDataMigrationUtilsTest.kt @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2022 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 android.net.netstats + +import android.net.NetworkStatsCollection +import androidx.test.InstrumentationRegistry +import androidx.test.filters.SmallTest +import com.android.frameworks.tests.net.R +import com.android.testutils.DevSdkIgnoreRule +import com.android.testutils.DevSdkIgnoreRunner +import com.android.testutils.SC_V2 +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.MockitoAnnotations +import java.io.DataInputStream +import java.net.ProtocolException +import kotlin.test.assertEquals +import kotlin.test.assertFailsWith +import kotlin.test.fail + +private const val BUCKET_DURATION_MS = 2 * 60 * 60 * 1000L + +@RunWith(DevSdkIgnoreRunner::class) +@SmallTest +@DevSdkIgnoreRule.IgnoreUpTo(SC_V2) // TODO: Use to Build.VERSION_CODES.SC_V2 when available +class NetworkStatsDataMigrationUtilsTest { + @Before + fun setup() { + MockitoAnnotations.initMocks(this) + } + + @Test + fun testReadPlatformCollection() { + // Verify the method throws for wrong file version. + assertFailsWith { + NetworkStatsDataMigrationUtils.readPlatformCollection( + NetworkStatsCollection.Builder(BUCKET_DURATION_MS), + getInputStreamForResource(R.raw.netstats_uid_v4)) + } + + val builder = NetworkStatsCollection.Builder(BUCKET_DURATION_MS) + NetworkStatsDataMigrationUtils.readPlatformCollection(builder, + getInputStreamForResource(R.raw.netstats_uid_v16)) + // The values are obtained by dumping from NetworkStatsCollection that + // read by the logic inside the service. + assertValues(builder.build(), 55, 1814302L, 21050L, 31001636L, 26152L) + } + + @Test + fun testMaybeReadLegacyUid() { + val builder = NetworkStatsCollection.Builder(BUCKET_DURATION_MS) + NetworkStatsDataMigrationUtils.readLegacyUid(builder, + getInputStreamForResource(R.raw.netstats_uid_v4), false /* taggedData */) + assertValues(builder.build(), 223, 106245210L, 710722L, 1130647496L, 1103989L) + } + + private fun assertValues( + collection: NetworkStatsCollection, + expectedSize: Int, + expectedTxBytes: Long, + expectedTxPackets: Long, + expectedRxBytes: Long, + expectedRxPackets: Long + ) { + var txBytes = 0L + var txPackets = 0L + var rxBytes = 0L + var rxPackets = 0L + val entries = collection.entries + + for (history in entries.values) { + for (historyEntry in history.entries) { + txBytes += historyEntry.txBytes + txPackets += historyEntry.txPackets + rxBytes += historyEntry.rxBytes + rxPackets += historyEntry.rxPackets + } + } + if (expectedSize != entries.size || + expectedTxBytes != txBytes || + expectedTxPackets != txPackets || + expectedRxBytes != rxBytes || + expectedRxPackets != rxPackets) { + fail("expected size=$expectedSize" + + "txb=$expectedTxBytes txp=$expectedTxPackets " + + "rxb=$expectedRxBytes rxp=$expectedRxPackets bus was " + + "size=${entries.size} txb=$txBytes txp=$txPackets " + + "rxb=$rxBytes rxp=$rxPackets") + } + assertEquals(txBytes + rxBytes, collection.totalBytes) + } + + private fun getInputStreamForResource(resourceId: Int): DataInputStream { + return DataInputStream(InstrumentationRegistry.getContext() + .getResources().openRawResource(resourceId)) + } +} diff --git a/tests/unit/res/raw/netstats_uid_v16 b/tests/unit/res/raw/netstats_uid_v16 new file mode 100644 index 0000000000000000000000000000000000000000..a6ee430b74b992942a708f42903dea5027a71718 GIT binary patch literal 5151 zcmZ?ta}8l&U=UznU|?ZjU|?flU|?i`0A@x8eiJh@14Bb|0|RqILjx0I1_nl$EZ6`4 z|NlS~f=OmDnR^#RF*W?!ckYFL!<;MkU+6P1FfcXj+RhBZAok4UX~`g3ObkT6l6oTr zq9r9kBuFy~Mm6<7`{@_@5VJw5K_-GQhz-`o1R@Tn?h)Y=; zZXKWgLcamYWQeO9Hr@CRb~`J`24t+rz`(#-H--5W<0+8&46KYSOkhh`yBMc1buo4^ z+JRIsu`n@#VVFl5SU)fx#;DNxda$+H+zFD@Vfp>f7> zS@6!p7?6J%Rm`2i!N4$8eu-(by$MK=LD9wq>=uwa85kJU{c$*f2{|Ev(hw}-LG1pC z8r#v#^a zg2ICB&=mGFQ`n!}VmsW$Ir}7Y7bp(dHgRv_ZsUH#bDdQJqy-vEs1$OTQRLdiO@b(v zfRX^jDz+JnZ>PLuIp!mat#~5I!_;yJgBT@YvSLgzKd^8 z7xOf|Q(yr;ZQeUfs;bE0kF!uBBS_aX#s`4HlnE(J)$>9AhGJyzGeW`?R0=>tlJNj2 zdogl=g*ZVZ$d4dTfeisMK;{rIWKpvbNb4L>!eQJu6{MPRIhX?~|B66zAX7l@1k;en zz~Y*hp!~xK$~BN8juBLCgB+n=4AuxCK;|Qx}!P)xuOgzX3x$Q>XfKxTnVAz;K}obG4@>4stgh9GQ5ut4qr z89}5wmf&4LffL=gxP z+=(7!2$5m37&*~@n*y?uaTz?(_d=aTglk@d0~cGO?*r+EVvzY{Bzlk$M0#iu*d5ps z{Z!&TgA~c&MhYSaPlI{{M3LzkkP)PNW(zp6fhq@(UiIlXJcGBwd7<893#w!|ctGS% z?!%x8m5CEv@qj#}J_CoTj18~~4BiYwif^=hFq3#gw&2VMvq0{FV$^WPa0%{w05Sv= zS|D=>7_tywK7hB@zy@LMW-94R^N%<|mAv6SRV3-M1=a-G+qYlM}y8O^?|Bgg0w30&M0VP}L7Az(B5NKrmh~yB$;%XV%Lz9#7Jz&LY4jWbHB%WuJ_kh**boo{WDrOZo)Wiz8YnR_ZUm(f#*>#px){HM z^nh6Epo#=!2nd4&@fd{LH6TMkrV(KXe%FAqGsqASMs*D=|G<+jZr6Ye!R{IiLr`3E z_X0>4;|Gw%AQrq#z}JHVxfFy!p$np67-R@6EKyS!(kKw_L=Nf0w=?!JwKIYsC?zp6 zK{_O?zZvhaJ!gE*2yWD~GIKLCgEAQ`f#J-&1X}IaK>a=DMNA+FN}5dI0UYK{j4e!? zK*7Px1hxj^F`OBi1zJL2j2(f7SwLkSG6spAO8u5{D)m$