• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2019 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 android.net.util
18 
19 import android.content.Context
20 import android.content.res.Resources
21 import android.net.NetworkCapabilities
22 import android.net.NetworkCapabilities.MAX_TRANSPORT
23 import android.net.NetworkCapabilities.TRANSPORT_CELLULAR
24 import android.net.NetworkCapabilities.TRANSPORT_ETHERNET
25 import android.net.NetworkCapabilities.TRANSPORT_VPN
26 import android.net.NetworkCapabilities.TRANSPORT_WIFI
27 import android.os.Build
28 import androidx.test.filters.SmallTest
29 import com.android.connectivity.resources.R
30 import com.android.server.connectivity.ConnectivityResources
31 import com.android.server.connectivity.KeepaliveResourceUtil
32 import com.android.testutils.DevSdkIgnoreRule
33 import com.android.testutils.DevSdkIgnoreRunner
34 import org.junit.After
35 import org.junit.Assert.assertArrayEquals
36 import org.junit.Assert.assertEquals
37 import org.junit.Assert.fail
38 import org.junit.Test
39 import org.junit.runner.RunWith
40 import org.mockito.ArgumentMatchers.eq
41 import org.mockito.Mockito.doReturn
42 import org.mockito.Mockito.mock
43 
44 /**
45  * Tests for [KeepaliveUtils].
46  *
47  * Build, install and run with:
48  * atest android.net.util.KeepaliveUtilsTest
49  */
50 @RunWith(DevSdkIgnoreRunner::class)
51 @SmallTest
52 @DevSdkIgnoreRule.IgnoreUpTo(Build.VERSION_CODES.R)
53 class KeepaliveUtilsTest {
54 
55     // Prepare mocked context with given resource strings.
getMockedContextWithStringArrayResnull56     private fun getMockedContextWithStringArrayRes(id: Int, res: Array<out String?>?): Context {
57         val mockRes = mock(Resources::class.java)
58         doReturn(res).`when`(mockRes).getStringArray(eq(id))
59 
60         return mock(Context::class.java).apply {
61             doReturn(mockRes).`when`(this).getResources()
62             ConnectivityResources.setResourcesContextForTest(this)
63         }
64     }
65 
66     @After
tearDownnull67     fun tearDown() {
68         ConnectivityResources.setResourcesContextForTest(null)
69     }
70 
71     @Test
testGetSupportedKeepalivesnull72     fun testGetSupportedKeepalives() {
73         fun assertRunWithException(res: Array<out String?>?) {
74             try {
75                 val mockContext = getMockedContextWithStringArrayRes(
76                         R.array.config_networkSupportedKeepaliveCount,
77                         res)
78                 KeepaliveResourceUtil.getSupportedKeepalives(mockContext)
79                 fail("Expected KeepaliveDeviceConfigurationException")
80             } catch (expected: KeepaliveResourceUtil.KeepaliveDeviceConfigurationException) {
81             }
82         }
83 
84         // Check resource with various invalid format.
85         assertRunWithException(null)
86         assertRunWithException(arrayOf<String?>(null))
87         assertRunWithException(arrayOfNulls<String?>(10))
88         assertRunWithException(arrayOf(""))
89         assertRunWithException(arrayOf("3,ABC"))
90         assertRunWithException(arrayOf("6,3,3"))
91         assertRunWithException(arrayOf("5"))
92 
93         // Check resource with invalid slots value.
94         assertRunWithException(arrayOf("3,-1"))
95 
96         // Check resource with invalid transport type.
97         assertRunWithException(arrayOf("-1,3"))
98         assertRunWithException(arrayOf("10,3"))
99 
100         // Check valid customization generates expected array.
101         val validRes = arrayOf("0,3", "1,0", "4,4")
102         val expectedValidRes = intArrayOf(3, 0, 0, 0, 4, 0, 0, 0, 0, 0)
103 
104         val mockContext = getMockedContextWithStringArrayRes(
105                 R.array.config_networkSupportedKeepaliveCount,
106                 validRes)
107         val actual = KeepaliveResourceUtil.getSupportedKeepalives(mockContext)
108         assertArrayEquals(expectedValidRes, actual)
109     }
110 
111     @Test
testGetSupportedKeepalivesForNetworkCapabilitiesnull112     fun testGetSupportedKeepalivesForNetworkCapabilities() {
113         // Mock customized supported keepalives for each transport type, and assuming:
114         //   3 for cellular,
115         //   6 for wifi,
116         //   0 for others.
117         val cust = IntArray(MAX_TRANSPORT + 1).apply {
118             this[TRANSPORT_CELLULAR] = 3
119             this[TRANSPORT_WIFI] = 6
120         }
121 
122         val nc = NetworkCapabilities()
123         // Check supported keepalives with single transport type.
124         nc.transportTypes = intArrayOf(TRANSPORT_CELLULAR)
125         assertEquals(3, KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc))
126 
127         // Check supported keepalives with multiple transport types.
128         nc.transportTypes = intArrayOf(TRANSPORT_WIFI, TRANSPORT_VPN)
129         assertEquals(0, KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc))
130 
131         // Check supported keepalives with non-customized transport type.
132         nc.transportTypes = intArrayOf(TRANSPORT_ETHERNET)
133         assertEquals(0, KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc))
134 
135         // Check supported keepalives with undefined transport type.
136         nc.transportTypes = intArrayOf(MAX_TRANSPORT + 1)
137         try {
138             KeepaliveUtils.getSupportedKeepalivesForNetworkCapabilities(cust, nc)
139             fail("Expected ArrayIndexOutOfBoundsException")
140         } catch (expected: ArrayIndexOutOfBoundsException) {
141         }
142     }
143 }
144