1 /* <lambda>null2 * Copyright (C) 2022 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.netstats 18 19 import android.net.NetworkStats.DEFAULT_NETWORK_ALL 20 import android.net.NetworkStats.METERED_ALL 21 import android.net.NetworkStats.METERED_YES 22 import android.net.NetworkStats.ROAMING_YES 23 import android.net.NetworkStats.ROAMING_ALL 24 import android.net.NetworkTemplate 25 import android.net.NetworkTemplate.MATCH_BLUETOOTH 26 import android.net.NetworkTemplate.MATCH_CARRIER 27 import android.net.NetworkTemplate.MATCH_ETHERNET 28 import android.net.NetworkTemplate.MATCH_MOBILE 29 import android.net.NetworkTemplate.MATCH_MOBILE_WILDCARD 30 import android.net.NetworkTemplate.MATCH_PROXY 31 import android.net.NetworkTemplate.MATCH_WIFI 32 import android.net.NetworkTemplate.MATCH_WIFI_WILDCARD 33 import android.net.NetworkTemplate.NETWORK_TYPE_ALL 34 import android.net.NetworkTemplate.OEM_MANAGED_ALL 35 import android.telephony.TelephonyManager 36 import com.android.net.module.util.NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL 37 import com.android.net.module.util.NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_EXACT 38 import com.android.testutils.ConnectivityModuleTest 39 import com.android.testutils.DevSdkIgnoreRule 40 import com.android.testutils.SC_V2 41 import org.junit.Rule 42 import org.junit.Test 43 import org.junit.runner.RunWith 44 import org.junit.runners.JUnit4 45 import kotlin.test.assertEquals 46 import kotlin.test.assertFailsWith 47 48 private const val TEST_IMSI1 = "imsi" 49 private const val TEST_WIFI_KEY1 = "wifiKey1" 50 private const val TEST_WIFI_KEY2 = "wifiKey2" 51 52 @RunWith(JUnit4::class) 53 @ConnectivityModuleTest 54 class NetworkTemplateTest { 55 @Rule 56 @JvmField 57 val ignoreRule = DevSdkIgnoreRule(ignoreClassUpTo = SC_V2) 58 59 @Test 60 fun testBuilderMatchRules() { 61 // Verify unknown match rules cannot construct templates. 62 listOf(Integer.MIN_VALUE, -1, Integer.MAX_VALUE).forEach { 63 assertFailsWith<IllegalArgumentException> { 64 NetworkTemplate.Builder(it).build() 65 } 66 } 67 68 // Verify hidden match rules cannot construct templates. 69 listOf(MATCH_WIFI_WILDCARD, MATCH_MOBILE_WILDCARD, MATCH_PROXY).forEach { 70 assertFailsWith<IllegalArgumentException> { 71 NetworkTemplate.Builder(it).build() 72 } 73 } 74 75 // Verify template which matches metered cellular and carrier networks with 76 // the given IMSI. See buildTemplateMobileAll and buildTemplateCarrierMetered. 77 listOf(MATCH_MOBILE, MATCH_CARRIER).forEach { matchRule -> 78 NetworkTemplate.Builder(matchRule).setSubscriberIds(setOf(TEST_IMSI1)) 79 .setMeteredness(METERED_YES).build().let { 80 val expectedTemplate = NetworkTemplate(matchRule, TEST_IMSI1, 81 arrayOf(TEST_IMSI1), arrayOf<String>(), METERED_YES, 82 ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 83 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) 84 assertEquals(expectedTemplate, it) 85 } 86 } 87 88 // Verify template which matches roaming cellular and carrier networks with 89 // the given IMSI. 90 listOf(MATCH_MOBILE, MATCH_CARRIER).forEach { matchRule -> 91 NetworkTemplate.Builder(matchRule).setSubscriberIds(setOf(TEST_IMSI1)) 92 .setRoaming(ROAMING_YES).setMeteredness(METERED_YES).build().let { 93 val expectedTemplate = NetworkTemplate(matchRule, TEST_IMSI1, 94 arrayOf(TEST_IMSI1), arrayOf<String>(), METERED_YES, 95 ROAMING_YES, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 96 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) 97 assertEquals(expectedTemplate, it) 98 } 99 } 100 101 // Verify carrier template cannot be created without IMSI. 102 assertFailsWith<IllegalArgumentException> { 103 NetworkTemplate.Builder(MATCH_CARRIER).build() 104 } 105 106 // Verify template which matches metered cellular networks, 107 // regardless of IMSI. See buildTemplateMobileWildcard. 108 NetworkTemplate.Builder(MATCH_MOBILE).setMeteredness(METERED_YES).build().let { 109 val expectedTemplate = NetworkTemplate(MATCH_MOBILE_WILDCARD, null /*subscriberId*/, 110 null /*subscriberIds*/, arrayOf<String>(), 111 METERED_YES, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 112 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_ALL) 113 assertEquals(expectedTemplate, it) 114 } 115 116 // Verify template which matches metered cellular networks and ratType. 117 // See NetworkTemplate#buildTemplateMobileWithRatType. 118 NetworkTemplate.Builder(MATCH_MOBILE).setSubscriberIds(setOf(TEST_IMSI1)) 119 .setMeteredness(METERED_YES).setRatType(TelephonyManager.NETWORK_TYPE_UMTS) 120 .build().let { 121 val expectedTemplate = NetworkTemplate(MATCH_MOBILE, TEST_IMSI1, 122 arrayOf(TEST_IMSI1), arrayOf<String>(), METERED_YES, 123 ROAMING_ALL, DEFAULT_NETWORK_ALL, TelephonyManager.NETWORK_TYPE_UMTS, 124 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) 125 assertEquals(expectedTemplate, it) 126 } 127 128 // Verify template which matches all wifi networks, 129 // regardless of Wifi Network Key. See buildTemplateWifiWildcard and buildTemplateWifi. 130 NetworkTemplate.Builder(MATCH_WIFI).build().let { 131 val expectedTemplate = NetworkTemplate(MATCH_WIFI_WILDCARD, null /*subscriberId*/, 132 null /*subscriberIds*/, arrayOf<String>(), 133 METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 134 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_ALL) 135 assertEquals(expectedTemplate, it) 136 } 137 138 // Verify template which matches wifi networks with the given Wifi Network Key. 139 // See buildTemplateWifi(wifiNetworkKey). 140 NetworkTemplate.Builder(MATCH_WIFI).setWifiNetworkKeys(setOf(TEST_WIFI_KEY1)).build().let { 141 val expectedTemplate = NetworkTemplate(MATCH_WIFI, null /*subscriberId*/, 142 null /*subscriberIds*/, arrayOf(TEST_WIFI_KEY1), 143 METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 144 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_ALL) 145 assertEquals(expectedTemplate, it) 146 } 147 148 // Verify template which matches all wifi networks with the 149 // given Wifi Network Key, and IMSI. See buildTemplateWifi(wifiNetworkKey, subscriberId). 150 NetworkTemplate.Builder(MATCH_WIFI).setSubscriberIds(setOf(TEST_IMSI1)) 151 .setWifiNetworkKeys(setOf(TEST_WIFI_KEY1)).build().let { 152 val expectedTemplate = NetworkTemplate(MATCH_WIFI, TEST_IMSI1, 153 arrayOf(TEST_IMSI1), arrayOf(TEST_WIFI_KEY1), 154 METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 155 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_EXACT) 156 assertEquals(expectedTemplate, it) 157 } 158 159 // Verify template which matches ethernet and bluetooth networks. 160 // See buildTemplateEthernet and buildTemplateBluetooth. 161 listOf(MATCH_ETHERNET, MATCH_BLUETOOTH).forEach { matchRule -> 162 NetworkTemplate.Builder(matchRule).build().let { 163 val expectedTemplate = NetworkTemplate(matchRule, null /*subscriberId*/, 164 null /*subscriberIds*/, arrayOf<String>(), 165 METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 166 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_ALL) 167 assertEquals(expectedTemplate, it) 168 } 169 } 170 } 171 172 @Test 173 fun testBuilderWifiNetworkKeys() { 174 // Verify template builder which generates same template with the given different 175 // sequence keys. 176 NetworkTemplate.Builder(MATCH_WIFI).setWifiNetworkKeys( 177 setOf(TEST_WIFI_KEY1, TEST_WIFI_KEY2)).build().let { 178 val expectedTemplate = NetworkTemplate.Builder(MATCH_WIFI).setWifiNetworkKeys( 179 setOf(TEST_WIFI_KEY2, TEST_WIFI_KEY1)).build() 180 assertEquals(expectedTemplate, it) 181 } 182 183 // Verify template which matches non-wifi networks with the given key is invalid. 184 listOf(MATCH_MOBILE, MATCH_CARRIER, MATCH_ETHERNET, MATCH_BLUETOOTH, -1, 185 Integer.MAX_VALUE).forEach { matchRule -> 186 assertFailsWith<IllegalArgumentException> { 187 NetworkTemplate.Builder(matchRule).setWifiNetworkKeys(setOf(TEST_WIFI_KEY1)).build() 188 } 189 } 190 191 // Verify template which matches wifi networks with the given null key is invalid. 192 assertFailsWith<IllegalArgumentException> { 193 NetworkTemplate.Builder(MATCH_WIFI).setWifiNetworkKeys(setOf(null)).build() 194 } 195 196 // Verify template which matches wifi wildcard with the given empty key set. 197 NetworkTemplate.Builder(MATCH_WIFI).setWifiNetworkKeys(setOf<String>()).build().let { 198 val expectedTemplate = NetworkTemplate(MATCH_WIFI_WILDCARD, null /*subscriberId*/, 199 arrayOf<String>() /*subscriberIds*/, arrayOf<String>(), 200 METERED_ALL, ROAMING_ALL, DEFAULT_NETWORK_ALL, NETWORK_TYPE_ALL, 201 OEM_MANAGED_ALL, SUBSCRIBER_ID_MATCH_RULE_ALL) 202 assertEquals(expectedTemplate, it) 203 } 204 } 205 } 206