• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2020 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.wifi;
18 
19 import static org.junit.Assert.*;
20 import static org.mockito.Mockito.*;
21 
22 import android.net.wifi.WifiConfiguration;
23 
24 import androidx.test.filters.SmallTest;
25 
26 import org.junit.Before;
27 import org.junit.Test;
28 import org.mockito.Mock;
29 import org.mockito.MockitoAnnotations;
30 
31 import java.util.Collections;
32 import java.util.HashSet;
33 import java.util.Set;
34 
35 @SmallTest
36 public class NonCarrierMergedNetworksStatusTrackerTest extends WifiBaseTest {
37     private static final long TEST_MIN_DISABLE_ALL_DURATION = 1000;
38     private static final long TEST_MAX_DISABLE_ALL_DURATION = 100000;
39     private static final long TEST_MIN_DURATION_NOT_SEEN_IN_SCANS = 3000;
40     private static final int TEST_SUBSCRIPTION_ID = 1;
41     private static final int INVALID_SUBSCRIPTION_ID = -1;
42     private NonCarrierMergedNetworksStatusTracker mNonCarrierMergedNetworksStatusTracker;
43     private WifiConfiguration mTestNonCarrierMergedNetwork;
44     @Mock private Clock mClock;
45 
46     @Before
setUp()47     public void setUp() throws Exception {
48         MockitoAnnotations.initMocks(this);
49         mNonCarrierMergedNetworksStatusTracker = new NonCarrierMergedNetworksStatusTracker(mClock);
50         mTestNonCarrierMergedNetwork = WifiConfigurationTestUtil.createOpenNetwork();
51     }
52 
53     // Need this because MissingCounterTimerLockList uses getWallClockMillis()
setClockTime(long millis)54     private void setClockTime(long millis) {
55         when(mClock.getWallClockMillis()).thenReturn(millis);
56         when(mClock.getElapsedSinceBootMillis()).thenReturn(millis);
57     }
58 
59     /**
60      * Verify that in the default state, networks are not disabled.
61      */
62     @Test
testNetworkIsEnabledByDefault()63     public void testNetworkIsEnabledByDefault() {
64         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
65                 mTestNonCarrierMergedNetwork));
66     }
67 
68     /**
69      * Verify that after disableAllNonCarrierMergedNetworks is called, a non-carrier-merged network
70      * that's not explicitly disabled by "temporarilyDisableNetwork" gets re-enabled when the min
71      * disable duration passes.
72      */
73     @Test
testDisableAllNonCarrierMergedNetworks()74     public void testDisableAllNonCarrierMergedNetworks() {
75         // start disabling non-carrier-merged networks.
76         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
77                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
78 
79         // verify the non-carrier-merged network is disabled before the disable duration is over.
80         setClockTime(TEST_MIN_DISABLE_ALL_DURATION - 1);
81         assertTrue(mNonCarrierMergedNetworksStatusTracker
82                 .isNetworkDisabled(mTestNonCarrierMergedNetwork));
83 
84         // verify the non-carrier-merged network is no longer disabled after the disable duration.
85         setClockTime(TEST_MIN_DISABLE_ALL_DURATION);
86         assertFalse(mNonCarrierMergedNetworksStatusTracker
87                 .isNetworkDisabled(mTestNonCarrierMergedNetwork));
88     }
89 
90     /**
91      * Verify that after disableAllNonCarrierMergedNetworks is called, a carrier-merged network
92      * with matching subscription ID is still enabled.
93      */
94     @Test
testCarrierMergedNetworkWithMatchingSubscriptionIdIsEnabled()95     public void testCarrierMergedNetworkWithMatchingSubscriptionIdIsEnabled() {
96         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
97                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
98         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
99                 mTestNonCarrierMergedNetwork));
100 
101         // verify a carrier-merged network with non-matching subscription ID is disabled.
102         WifiConfiguration testConfig = WifiConfigurationTestUtil.createOpenNetwork();
103         testConfig.carrierMerged = true;
104         testConfig.subscriptionId = INVALID_SUBSCRIPTION_ID;
105         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(testConfig));
106 
107         // verify a non-carrier-merged network with matching subscription ID is disabled.
108         testConfig.carrierMerged = false;
109         testConfig.subscriptionId = TEST_SUBSCRIPTION_ID;
110         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(testConfig));
111 
112         // verify a carrier-merged network with matching subscription ID is not disabled.
113         testConfig.carrierMerged = true;
114         testConfig.subscriptionId = TEST_SUBSCRIPTION_ID;
115         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(testConfig));
116     }
117 
118     /**
119      * Verify that after disableAllNonCarrierMergedNetworks is called, a non-carrier-merged network
120      * is disabled until clear() is called.
121      */
122     @Test
testClearWillUndoDisableAllNonCarrierMergedNetworks()123     public void testClearWillUndoDisableAllNonCarrierMergedNetworks() {
124         // first verify that without doing anything, non-carrier-merged networks are enabled.
125         WifiConfiguration testConfig = WifiConfigurationTestUtil.createOpenNetwork();
126         // start disabling non-carrier-merged networks.
127         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
128                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
129 
130         // verify the non-carrier-merged network is disabled.
131         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(testConfig));
132 
133         // verify the non-carrier-merged network is no longer disabled after "clear" is called.
134         mNonCarrierMergedNetworksStatusTracker.clear();
135         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(testConfig));
136     }
137 
138     /**
139      * Verify that when a specific network is disabled through temporarilyDisableNetwork. It is
140      * re-enabled after it's not seen in scan results for the specified duration.
141      */
142     @Test
testTemporarilyDisableNetwork()143     public void testTemporarilyDisableNetwork() {
144         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
145                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
146         mNonCarrierMergedNetworksStatusTracker.temporarilyDisableNetwork(
147                 mTestNonCarrierMergedNetwork, TEST_MIN_DURATION_NOT_SEEN_IN_SCANS,
148                 TEST_MAX_DISABLE_ALL_DURATION);
149         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
150                 mTestNonCarrierMergedNetwork));
151 
152         mNonCarrierMergedNetworksStatusTracker.update(Collections.EMPTY_SET);
153         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
154                 mTestNonCarrierMergedNetwork));
155 
156         // verify that after the network is gone from scan results for long enough, the
157         // network is no longer disabled.
158         setClockTime(TEST_MIN_DURATION_NOT_SEEN_IN_SCANS + 1);
159         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
160                 mTestNonCarrierMergedNetwork));
161     }
162 
163     /**
164      * Verify that a non-carrier merged network disabled with temporarilyDisableNetwork gets
165      * re-enabled after the max disable duration passes even though the network is still seen in
166      * scan results.
167      */
168     @Test
testTemporarilyDisableNetworkWithMaxDisableDuration()169     public void testTemporarilyDisableNetworkWithMaxDisableDuration() {
170         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
171                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
172         mNonCarrierMergedNetworksStatusTracker.temporarilyDisableNetwork(
173                 mTestNonCarrierMergedNetwork, TEST_MIN_DURATION_NOT_SEEN_IN_SCANS,
174                 TEST_MAX_DISABLE_ALL_DURATION);
175         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
176                 mTestNonCarrierMergedNetwork));
177 
178         // verify the network is still disabled after the network is seen in scan results 1ms
179         // before the max disable duration timeout.
180         setClockTime(TEST_MAX_DISABLE_ALL_DURATION - 1);
181         Set<String> networks = new HashSet<>();
182         networks.add(mTestNonCarrierMergedNetwork.SSID);
183         mNonCarrierMergedNetworksStatusTracker.update(networks);
184         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
185                 mTestNonCarrierMergedNetwork));
186 
187         // verify the network is re-enabled after the max disable duration.
188         setClockTime(TEST_MAX_DISABLE_ALL_DURATION);
189         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
190                 mTestNonCarrierMergedNetwork));
191     }
192 
193     /**
194      * Verify that a network disabled by temporarilyDisableNetwork is re-enabled when clear() is
195      * called.
196      */
197     @Test
testClearResetsTemporarilyDisableNetwork()198     public void testClearResetsTemporarilyDisableNetwork() {
199         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
200                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
201         mNonCarrierMergedNetworksStatusTracker.temporarilyDisableNetwork(
202                 mTestNonCarrierMergedNetwork, TEST_MIN_DURATION_NOT_SEEN_IN_SCANS,
203                 TEST_MAX_DISABLE_ALL_DURATION);
204         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
205                 mTestNonCarrierMergedNetwork));
206 
207         mNonCarrierMergedNetworksStatusTracker.clear();
208         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
209                 mTestNonCarrierMergedNetwork));
210     }
211 
212     /**
213      * Verify that when a temporarily disabled network shows up in scan results, we reset the
214      * counter needed to re-enable it.
215      */
216     @Test
testNetworkAppearingWillResetCounter()217     public void testNetworkAppearingWillResetCounter() {
218         mNonCarrierMergedNetworksStatusTracker.disableAllNonCarrierMergedNetworks(
219                 TEST_SUBSCRIPTION_ID, TEST_MIN_DISABLE_ALL_DURATION, TEST_MAX_DISABLE_ALL_DURATION);
220         mNonCarrierMergedNetworksStatusTracker.temporarilyDisableNetwork(
221                 mTestNonCarrierMergedNetwork, TEST_MIN_DURATION_NOT_SEEN_IN_SCANS,
222                 TEST_MAX_DISABLE_ALL_DURATION);
223         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
224                 mTestNonCarrierMergedNetwork));
225         mNonCarrierMergedNetworksStatusTracker.update(Collections.EMPTY_SET);
226 
227         // simulate the network appearing from scan results after some time.
228         long networkAppearTime = 1200;
229         setClockTime(networkAppearTime);
230         Set<String> networks = new HashSet<>();
231         networks.add(mTestNonCarrierMergedNetwork.SSID);
232         mNonCarrierMergedNetworksStatusTracker.update(networks);
233 
234         // simulate the network dissapearing from scan results again.
235         mNonCarrierMergedNetworksStatusTracker.update(Collections.EMPTY_SET);
236 
237         // verify that the timer was reset properly
238         setClockTime(networkAppearTime + TEST_MIN_DURATION_NOT_SEEN_IN_SCANS);
239         assertTrue(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
240                 mTestNonCarrierMergedNetwork));
241         setClockTime(networkAppearTime + TEST_MIN_DURATION_NOT_SEEN_IN_SCANS + 1);
242         assertFalse(mNonCarrierMergedNetworksStatusTracker.isNetworkDisabled(
243                 mTestNonCarrierMergedNetwork));
244     }
245 }
246