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 }