• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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