1 /* 2 * Copyright (C) 2024 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.stats.pull.netstats 18 19 import android.net.NetworkStats 20 import android.net.NetworkStats.DEFAULT_NETWORK_NO 21 import android.net.NetworkStats.DEFAULT_NETWORK_YES 22 import android.net.NetworkStats.Entry 23 import android.net.NetworkStats.METERED_NO 24 import android.net.NetworkStats.ROAMING_NO 25 import android.net.NetworkStats.ROAMING_YES 26 import android.net.NetworkStats.SET_DEFAULT 27 import android.net.NetworkStats.TAG_NONE 28 import androidx.test.ext.junit.runners.AndroidJUnit4 29 import com.android.testutils.assertEntryEquals 30 import com.android.testutils.assertNetworkStatsEquals 31 import com.android.testutils.makePublicStatsFromAndroidNetStats 32 import org.junit.Test 33 import org.junit.runner.RunWith 34 import org.mockito.Mockito.doReturn 35 import org.mockito.Mockito.mock 36 import org.mockito.Mockito.`when` 37 38 /** 39 * Build/Install/Run: 40 * atest FrameworksServicesTests:NetworkStatsUtilsTest 41 */ 42 @RunWith(AndroidJUnit4::class) 43 class NetworkStatsUtilsTest { 44 45 @Test testBucketToEntrynull46 fun testBucketToEntry() { 47 val bucket = makeMockBucket(android.app.usage.NetworkStats.Bucket.UID_ALL, 48 android.app.usage.NetworkStats.Bucket.TAG_NONE, 49 android.app.usage.NetworkStats.Bucket.STATE_DEFAULT, 50 android.app.usage.NetworkStats.Bucket.METERED_YES, 51 android.app.usage.NetworkStats.Bucket.ROAMING_NO, 52 android.app.usage.NetworkStats.Bucket.DEFAULT_NETWORK_ALL, 1024, 8, 2048, 12) 53 val entry = NetworkStatsUtils.fromBucket(bucket) 54 val expectedEntry = NetworkStats.Entry(null /* IFACE_ALL */, NetworkStats.UID_ALL, 55 NetworkStats.SET_DEFAULT, NetworkStats.TAG_NONE, NetworkStats.METERED_YES, 56 NetworkStats.ROAMING_NO, NetworkStats.DEFAULT_NETWORK_ALL, 1024, 8, 2048, 12, 57 0 /* operations */) 58 59 assertEntryEquals(expectedEntry, entry) 60 } 61 62 @Test testPublicStatsToAndroidNetStatsnull63 fun testPublicStatsToAndroidNetStats() { 64 val uid1 = 10001 65 val uid2 = 10002 66 val testIface = "wlan0" 67 val testAndroidNetStats = NetworkStats(0L, 3) 68 .addEntry(Entry(testIface, uid1, SET_DEFAULT, TAG_NONE, 69 METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, 20, 3, 57, 40, 3)) 70 .addEntry(Entry( 71 testIface, uid2, SET_DEFAULT, TAG_NONE, 72 METERED_NO, ROAMING_YES, DEFAULT_NETWORK_NO, 2, 7, 2, 5, 7)) 73 .addEntry(Entry(testIface, uid2, SET_DEFAULT, TAG_NONE, 74 METERED_NO, ROAMING_YES, DEFAULT_NETWORK_NO, 4, 5, 3, 1, 8)) 75 val publicStats: android.app.usage.NetworkStats = 76 makePublicStatsFromAndroidNetStats(testAndroidNetStats) 77 val androidNetStats: NetworkStats = 78 NetworkStatsUtils.fromPublicNetworkStats(publicStats) 79 80 // 1. The public `NetworkStats` class does not include interface information. 81 // Interface details must be removed and items with duplicated 82 // keys need to be merged before making any comparisons. 83 // 2. The public `NetworkStats` class lacks an operations field. 84 // Thus, the information will not be preserved during the conversion. 85 val expectedStats = NetworkStats(0L, 2) 86 .addEntry(Entry(null, uid1, SET_DEFAULT, TAG_NONE, 87 METERED_NO, ROAMING_NO, DEFAULT_NETWORK_YES, 20, 3, 57, 40, 0)) 88 .addEntry(Entry(null, uid2, SET_DEFAULT, TAG_NONE, 89 METERED_NO, ROAMING_YES, DEFAULT_NETWORK_NO, 6, 12, 5, 6, 0)) 90 assertNetworkStatsEquals(expectedStats, androidNetStats) 91 } 92 makeMockBucketnull93 private fun makeMockBucket( 94 uid: Int, 95 tag: Int, 96 state: Int, 97 metered: Int, 98 roaming: Int, 99 defaultNetwork: Int, 100 rxBytes: Long, 101 rxPackets: Long, 102 txBytes: Long, 103 txPackets: Long 104 ): android.app.usage.NetworkStats.Bucket { 105 val ret: android.app.usage.NetworkStats.Bucket = 106 mock(android.app.usage.NetworkStats.Bucket::class.java) 107 doReturn(uid).`when`(ret).getUid() 108 doReturn(tag).`when`(ret).getTag() 109 doReturn(state).`when`(ret).getState() 110 doReturn(metered).`when`(ret).getMetered() 111 doReturn(roaming).`when`(ret).getRoaming() 112 doReturn(defaultNetwork).`when`(ret).getDefaultNetworkStatus() 113 doReturn(rxBytes).`when`(ret).getRxBytes() 114 doReturn(rxPackets).`when`(ret).getRxPackets() 115 doReturn(txBytes).`when`(ret).getTxBytes() 116 doReturn(txPackets).`when`(ret).getTxPackets() 117 return ret 118 } 119 }