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