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