WifiConfigManagerTest.java revision b3706e8c20fdf0a0e2b4ec15355ae6f98588b732
150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius/*
250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * Copyright (C) 2016 The Android Open Source Project
350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius *
450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * Licensed under the Apache License, Version 2.0 (the "License");
550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * you may not use this file except in compliance with the License.
650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * You may obtain a copy of the License at
750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius *
850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius *      http://www.apache.org/licenses/LICENSE-2.0
950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius *
1050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * Unless required by applicable law or agreed to in writing, software
1150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * distributed under the License is distributed on an "AS IS" BASIS,
1250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * See the License for the specific language governing permissions and
1450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius * limitations under the License.
1550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius */
1650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1750eed92fe9556fdd9934683690181fea77ce4eacRoshan Piuspackage com.android.server.wifi;
1850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1950eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport static org.junit.Assert.*;
2050eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport static org.mockito.Mockito.*;
2150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2250eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
2350eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.content.Context;
246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.content.Intent;
2565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Piusimport android.content.pm.ApplicationInfo;
2650eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.content.pm.PackageManager;
27c381d005c60603aadd30581ce675e979b3fec3feRoshan Piusimport android.content.pm.UserInfo;
2850eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.net.IpConfiguration;
2922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Piusimport android.net.wifi.ScanResult;
3050eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.net.wifi.WifiConfiguration;
31fc789b2227e92372b2489ca54691310800835a50Roshan Piusimport android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
321fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Piusimport android.net.wifi.WifiEnterpriseConfig;
336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.net.wifi.WifiManager;
34fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Piusimport android.net.wifi.WifiScanner;
3522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Piusimport android.net.wifi.WifiSsid;
366e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.os.UserHandle;
3750eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.os.UserManager;
3896241bee619ff7073635f680a36869f61a11a225Roshan Piusimport android.telephony.TelephonyManager;
3950eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.test.suitebuilder.annotation.SmallTest;
406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.text.TextUtils;
4150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Piusimport com.android.internal.R;
433a738a26918230b2469d917dbf14323234edd39bRoshan Piusimport com.android.server.wifi.WifiConfigStoreLegacy.WifiConfigStoreDataLegacy;
448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
45ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Piusimport org.junit.After;
4650eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.junit.Before;
4750eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.junit.Test;
486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport org.mockito.ArgumentCaptor;
496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport org.mockito.InOrder;
5050eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.mockito.Mock;
5150eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.mockito.MockitoAnnotations;
5250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
5342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.FileDescriptor;
5442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.PrintWriter;
5542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.StringWriter;
5650eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport java.util.ArrayList;
571fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Piusimport java.util.Arrays;
582dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Piusimport java.util.HashSet;
5950eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport java.util.List;
60674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Piusimport java.util.Set;
6150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
6250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius/**
63a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius * Unit tests for {@link com.android.server.wifi.WifiConfigManager}.
6450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius */
6550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius@SmallTest
66a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Piuspublic class WifiConfigManagerTest {
6750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
6850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final String TEST_BSSID = "0a:08:5c:67:89:00";
6950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final long TEST_WALLCLOCK_CREATION_TIME_MILLIS = 9845637;
7050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final long TEST_WALLCLOCK_UPDATE_TIME_MILLIS = 75455637;
71fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private static final long TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS = 29457631;
7250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final int TEST_CREATOR_UID = 5;
7350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final int TEST_UPDATE_UID = 4;
746d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    private static final int TEST_SYSUI_UID = 56;
756d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    private static final int TEST_DEFAULT_USER = UserHandle.USER_SYSTEM;
762dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private static final int TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN = 5;
772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private static final Integer[] TEST_FREQ_LIST = {2400, 2450, 5150, 5175, 5650};
7850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final String TEST_CREATOR_NAME = "com.wificonfigmanagerNew.creator";
7950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final String TEST_UPDATE_NAME = "com.wificonfigmanagerNew.update";
808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    private static final String TEST_DEFAULT_GW_MAC_ADDRESS = "0f:67:ad:ef:09:34";
8150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
8250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private Context mContext;
8350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private FrameworkFacade mFrameworkFacade;
8450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private Clock mClock;
8550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private UserManager mUserManager;
8696241bee619ff7073635f680a36869f61a11a225Roshan Pius    @Mock private TelephonyManager mTelephonyManager;
8750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private WifiKeyStore mWifiKeyStore;
88a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius    @Mock private WifiConfigStore mWifiConfigStore;
893a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Mock private WifiConfigStoreLegacy mWifiConfigStoreLegacy;
9050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private PackageManager mPackageManager;
9150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private MockResources mResources;
936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private InOrder mContextConfigStoreMockOrder;
94a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius    private WifiConfigManager mWifiConfigManager;
9550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
9650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
97a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Setup the mocks and an instance of WifiConfigManager before each test.
9850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
9950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Before
10050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void setUp() throws Exception {
10150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        MockitoAnnotations.initMocks(this);
10250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Set up the inorder for verifications. This is needed to verify that the broadcasts,
1046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // store writes for network updates followed by network additions are in the expected order.
1056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        mContextConfigStoreMockOrder = inOrder(mContext, mWifiConfigStore);
1066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
10750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Set up the package name stuff & permission override.
10850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mContext.getPackageManager()).thenReturn(mPackageManager);
1092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources = new MockResources();
1102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setBoolean(
1118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                R.bool.config_wifi_only_link_same_credential_configurations, true);
1122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
1132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
1142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN);
1152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        when(mContext.getResources()).thenReturn(mResources);
1168600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
1176d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Setup UserManager profiles for the default user.
1186d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(TEST_DEFAULT_USER);
1196d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
12050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
12150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public String answer(int uid) throws Exception {
12250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                if (uid == TEST_CREATOR_UID) {
12350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return TEST_CREATOR_NAME;
12450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                } else if (uid == TEST_UPDATE_UID) {
12550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return TEST_UPDATE_NAME;
1266d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                } else if (uid == TEST_SYSUI_UID) {
127a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    return WifiConfigManager.SYSUI_PACKAGE_NAME;
12850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
12950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                fail("Unexpected UID: " + uid);
13050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return "";
13150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
13250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mPackageManager).getNameForUid(anyInt());
1336d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        doAnswer(new AnswerWithArguments() {
1346d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius            public int answer(String packageName, int flags, int userId) throws Exception {
135a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                if (packageName.equals(WifiConfigManager.SYSUI_PACKAGE_NAME)) {
1366d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                    return TEST_SYSUI_UID;
1376d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                } else {
1386d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                    return 0;
1396d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                }
1406d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius            }
1416d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        }).when(mPackageManager).getPackageUidAsUser(anyString(), anyInt(), anyInt());
14250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
14350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Both the UID's in the test have the configuration override permission granted by
14450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // default. This maybe modified for particular tests if needed.
14550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
14650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public int answer(String permName, int uid) throws Exception {
14750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                if (uid == TEST_CREATOR_UID || uid == TEST_UPDATE_UID) {
14850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return PackageManager.PERMISSION_GRANTED;
14950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
15050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return PackageManager.PERMISSION_DENIED;
15150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
15250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
15350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1541fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        when(mWifiKeyStore
1551fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                .updateNetworkKeys(any(WifiConfiguration.class), any(WifiConfiguration.class)))
1561fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                .thenReturn(true);
1571fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
1583a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(true);
1593a738a26918230b2469d917dbf14323234edd39bRoshan Pius
1602dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
16150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
16250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
16350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
164ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius     * Called after each test
165ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius     */
166ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    @After
167ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    public void cleanup() {
168ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius        validateMockitoUsage();
169ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    }
170ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius
171ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    /**
17250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single network using
173a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
17450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
17550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
17650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleOpenNetwork() {
17750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
17850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
17950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
18050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
18250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
18350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
18450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
18550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
18650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
1870ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        // Ensure that the newly added network is disabled.
1880ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        assertEquals(WifiConfiguration.Status.DISABLED, retrievedNetworks.get(0).status);
18950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
19050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
19150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
19250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the modification of a single network using
193a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
19450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
19550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
19650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetwork() {
19750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
19850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
19950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
20050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
20250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID for the network.
20450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
2056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
20650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
20750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that the modification has been effective.
20850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
20950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
21050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
21150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
21250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
21350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
21450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
21550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single ephemeral network using
216a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
217a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * the {@link WifiConfigManager#getSavedNetworks()} does not return this network.
21850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
21950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
22050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleEphemeralNetwork() {
22150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
22250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        openNetwork.ephemeral = true;
22350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
22450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
22550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddEphemeralNetworkToWifiConfigManager(openNetwork);
22750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
22850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
22950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
23050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
23150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
23250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
23350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Ensure that this is not returned in the saved network list.
23450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(mWifiConfigManager.getSavedNetworks().isEmpty());
23550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
23650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
23750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
23850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies that the modification of a single open network using
239a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with a UID which
24050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * has no permission to modify the network fails.
24150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
24250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
24350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetworkFailedDueToPermissionDenied() throws Exception {
24450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
24550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
24650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
24750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
24950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2506e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
25150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
25250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
25350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Deny permission for |UPDATE_UID|.
25450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
25550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public int answer(String permName, int uid) throws Exception {
25650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                if (uid == TEST_CREATOR_UID) {
25750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return PackageManager.PERMISSION_GRANTED;
25850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
25950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return PackageManager.PERMISSION_DENIED;
26050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
26150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
26250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
26350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration and ensure that the operation failed.
2646e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = updateNetworkToWifiConfigManager(openNetwork);
26550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(result.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
26650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
26750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
26850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
26950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies that the modification of a single open network using
270a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with the creator UID
27150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * should always succeed.
27250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
27350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
27450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetworkSuccessWithCreatorUID() throws Exception {
27550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
27650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
27750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
27850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
28050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
28250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
28350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
28450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Deny permission for all UIDs.
28550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
28650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public int answer(String permName, int uid) throws Exception {
28750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return PackageManager.PERMISSION_DENIED;
28850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
28950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
29050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
29150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration using the creator UID.
2926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result =
2936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(openNetwork, TEST_CREATOR_UID);
29450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
29550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
29650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that the modification has been effective.
29750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
29850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
29950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
30050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
30150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
30250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
30350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
30450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single PSK network using
305a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
306a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworks()} masks the password.
30750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
30850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
30950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSinglePskNetwork() {
31050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
31150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
31250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(pskNetwork);
31350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3146e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
31550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
31650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
31750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
31850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
31950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
32050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
32150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedSavedNetworks = mWifiConfigManager.getSavedNetworks();
32250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.size(), 1);
32350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.get(0).configKey(), pskNetwork.configKey());
3246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedSavedNetworks.get(0));
32550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
32650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
32750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
32850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single WEP network using
329a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
330a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworks()} masks the password.
33150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
33250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
33350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleWepNetwork() {
33450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
33550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
33650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(wepNetwork);
33750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
33950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
34050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
34150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
34250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
34350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
34450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
34550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedSavedNetworks = mWifiConfigManager.getSavedNetworks();
34650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.size(), 1);
34750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.get(0).configKey(), wepNetwork.configKey());
3486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedSavedNetworks.get(0));
34950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
35050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
35150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
35250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the modification of an IpConfiguration using
353a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
35450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
35550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
35650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateIpConfiguration() {
35750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
35850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
35950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
36050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3616e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
36250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3636e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
36450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
36550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
36650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration and ensure that the IP configuration change flags
36750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // are not set.
3686e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
36950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
37050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Change the IpConfiguration now and ensure that the IP configuration flags are set now.
37150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkIpConfiguration(
37250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                openNetwork,
37350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                WifiConfigurationTestUtil.createStaticIpConfigurationWithStaticProxy());
3746e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithIpChange(openNetwork);
37550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
37650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that all the modifications have been effective.
37750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
37850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
37950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
38050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
38150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
38250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
38350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
384c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * Verifies the removal of a single network using
385a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
386c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
387c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    @Test
388c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    public void testRemoveSingleOpenNetwork() {
389c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
390c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
391c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(openNetwork);
392c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
393c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
394c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
395c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(openNetwork);
396c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
397c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Ensure that configured network list is empty now.
398c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
399c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
400c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
401c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
402fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the addition & update of multiple networks using
403a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and the
404c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * removal of networks using
405a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
406c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
407c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    @Test
408fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testAddUpdateRemoveMultipleNetworks() {
409c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
410c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
411c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
412c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
413c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(openNetwork);
414c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(pskNetwork);
415c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(wepNetwork);
416c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
417c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
418c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
419c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
420c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
421c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now verify that all the additions has been effective.
422c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> retrievedNetworks =
423c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
424c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
425c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                networks, retrievedNetworks);
426c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
427c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Modify all the 3 configurations and update it to WifiConfigManager.
428c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
429c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkBSSID(pskNetwork, TEST_BSSID);
430c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkIpConfiguration(
431c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                wepNetwork,
432c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                WifiConfigurationTestUtil.createStaticIpConfigurationWithPacProxy());
433c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
434c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
435c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(pskNetwork);
436c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithIpChange(wepNetwork);
437c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now verify that all the modifications has been effective.
438c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
439c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
440c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                networks, retrievedNetworks);
441c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
442c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now remove all 3 networks.
443c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(openNetwork);
444c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(pskNetwork);
445c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(wepNetwork);
446c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
447c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Ensure that configured network list is empty now.
448c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
449c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
450c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
451c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
452fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the update of network status using
453a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)}.
454fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
455fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
456fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testNetworkSelectionStatus() {
457fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
458fc789b2227e92372b2489ca54691310800835a50Roshan Pius
459fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
460fc789b2227e92372b2489ca54691310800835a50Roshan Pius
461fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
462fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
463fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
464fc789b2227e92372b2489ca54691310800835a50Roshan Pius
465fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled. The threshold for association rejection is 5, so
466fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // disable it 5 times to actually mark it temporarily disabled.
467fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
468fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectThreshold =
469a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
470fc789b2227e92372b2489ca54691310800835a50Roshan Pius        for (int i = 1; i <= assocRejectThreshold; i++) {
471fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkSelectionStatus(result.getNetworkId(), assocRejectReason, i);
472fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
473fc789b2227e92372b2489ca54691310800835a50Roshan Pius
474fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to permanently disabled.
475fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
476fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER, 0);
477fc789b2227e92372b2489ca54691310800835a50Roshan Pius
478fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it back to enabled.
479fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
480fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
481fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
482fc789b2227e92372b2489ca54691310800835a50Roshan Pius
483fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
484fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the update of network status using
485a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and ensures that
486fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * enabling a network clears out all the temporary disable counters.
487fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
488fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
489fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testNetworkSelectionStatusEnableClearsDisableCounters() {
490fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
491fc789b2227e92372b2489ca54691310800835a50Roshan Pius
492fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
493fc789b2227e92372b2489ca54691310800835a50Roshan Pius
494fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
495fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
496fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
497fc789b2227e92372b2489ca54691310800835a50Roshan Pius
498fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled 2 times for 2 different reasons.
499fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
500fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 1);
501fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
502fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 2);
503fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
504fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 1);
505fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
506fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 2);
507fc789b2227e92372b2489ca54691310800835a50Roshan Pius
508fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it back to enabled.
509fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
510fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
511fc789b2227e92372b2489ca54691310800835a50Roshan Pius
512fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Ensure that the counters have all been reset now.
513fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
514fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 1);
515fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
516fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 1);
517fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
518fc789b2227e92372b2489ca54691310800835a50Roshan Pius
519fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
520fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the enabling of temporarily disabled network using
521a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#tryEnableNetwork(int)}.
522fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
523fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
524fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testTryEnableNetwork() {
525fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
526fc789b2227e92372b2489ca54691310800835a50Roshan Pius
527fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
528fc789b2227e92372b2489ca54691310800835a50Roshan Pius
529fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
530fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
531fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
532fc789b2227e92372b2489ca54691310800835a50Roshan Pius
533fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled. The threshold for association rejection is 5, so
534fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // disable it 5 times to actually mark it temporarily disabled.
535fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
536fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectThreshold =
537a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
538fc789b2227e92372b2489ca54691310800835a50Roshan Pius        for (int i = 1; i <= assocRejectThreshold; i++) {
539fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkSelectionStatus(result.getNetworkId(), assocRejectReason, i);
540fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
541fc789b2227e92372b2489ca54691310800835a50Roshan Pius
542fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now let's try enabling this network without changing the time, this should fail and the
543fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // status remains temporarily disabled.
544fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertFalse(mWifiConfigManager.tryEnableNetwork(result.getNetworkId()));
545fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus retrievedStatus =
546fc789b2227e92372b2489ca54691310800835a50Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
547fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        .getNetworkSelectionStatus();
548fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(retrievedStatus.isNetworkTemporaryDisabled());
549fc789b2227e92372b2489ca54691310800835a50Roshan Pius
550fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now advance time by the timeout for association rejection and ensure that the network
551fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // is now enabled.
552fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectTimeout =
553a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_TIMEOUT_MS[assocRejectReason];
554fc789b2227e92372b2489ca54691310800835a50Roshan Pius        when(mClock.getElapsedSinceBootMillis())
555fc789b2227e92372b2489ca54691310800835a50Roshan Pius                .thenReturn(TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS + assocRejectTimeout);
556fc789b2227e92372b2489ca54691310800835a50Roshan Pius
557fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(mWifiConfigManager.tryEnableNetwork(result.getNetworkId()));
558fc789b2227e92372b2489ca54691310800835a50Roshan Pius        retrievedStatus =
559fc789b2227e92372b2489ca54691310800835a50Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
560fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        .getNetworkSelectionStatus();
561fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
562fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
563fc789b2227e92372b2489ca54691310800835a50Roshan Pius
564fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
565a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the enabling of network using
566a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} and
567a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#disableNetwork(int, int)}.
568a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
569a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
570a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testEnableDisableNetwork() {
571a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
572a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
573a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
574a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
575a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
576a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), false, TEST_CREATOR_UID));
577a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
578a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
579a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
580a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
581a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
582a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
583a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now set it disabled.
584a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_CREATOR_UID));
585a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
586a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
587a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkPermanentlyDisabled());
588a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.DISABLED);
589a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
590a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
591a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
592a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the enabling of network using
593a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} with a UID which
594a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * has no permission to modify the network fails..
595a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
596a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
597a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testEnableDisableNetworkFailedDueToPermissionDenied() throws Exception {
598a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
599a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
600a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
601a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
602a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
603a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), false, TEST_CREATOR_UID));
604a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
605a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
606a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
607a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
608a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
609a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
610a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Deny permission for |UPDATE_UID|.
611a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        doAnswer(new AnswerWithArguments() {
612a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            public int answer(String permName, int uid) throws Exception {
613a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                if (uid == TEST_CREATOR_UID) {
614a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                    return PackageManager.PERMISSION_GRANTED;
615a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                }
616a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                return PackageManager.PERMISSION_DENIED;
617a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            }
618a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
619a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
620a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now try to set it disabled with |TEST_UPDATE_UID|, it should fail and the network
621a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // should remain enabled.
622a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_UPDATE_UID));
623a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedStatus =
624a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
625a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                        .getNetworkSelectionStatus();
626a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
627a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(WifiConfiguration.Status.ENABLED, retrievedNetwork.status);
628a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
629a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
630a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
631a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the updation of network's connectUid using
632a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#checkAndUpdateLastConnectUid(int, int)}.
633a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
634a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
635a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testUpdateLastConnectUid() throws Exception {
636a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
637a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
638a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
639a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
640a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(
6412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.checkAndUpdateLastConnectUid(
6422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                        result.getNetworkId(), TEST_CREATOR_UID));
643a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
644a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
645a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(TEST_CREATOR_UID, retrievedNetwork.lastConnectUid);
646a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
647a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Deny permission for |UPDATE_UID|.
648a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        doAnswer(new AnswerWithArguments() {
649a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            public int answer(String permName, int uid) throws Exception {
650a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                if (uid == TEST_CREATOR_UID) {
651a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                    return PackageManager.PERMISSION_GRANTED;
652a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                }
653a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                return PackageManager.PERMISSION_DENIED;
654a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            }
655a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
656a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
657a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now try to update the last connect UID with |TEST_UPDATE_UID|, it should fail and
658a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // the lastConnectUid should remain the same.
659a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(
6601fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                mWifiConfigManager.checkAndUpdateLastConnectUid(
6611fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                        result.getNetworkId(), TEST_UPDATE_UID));
662a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
663a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(TEST_CREATOR_UID, retrievedNetwork.lastConnectUid);
664a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
665a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
666a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
667a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration update attempt with an null config is gracefully
668a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
669a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
670a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
671a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
672a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testAddOrUpdateNetworkWithNullConfig() {
673a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(null, TEST_CREATOR_UID);
674a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(result.isSuccess());
675a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
676a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
677a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
678a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration removal attempt with an invalid networkID is gracefully
679a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
680a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#removeNetwork(int)}.
681a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
682a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
683a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testRemoveNetworkWithInvalidNetworkId() {
684a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
685a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
686a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
687a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
688a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Change the networkID to an invalid one.
689a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        openNetwork.networkId++;
6906d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertFalse(mWifiConfigManager.removeNetwork(openNetwork.networkId, TEST_CREATOR_UID));
691a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
692a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
693a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
694a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration update attempt with an invalid networkID is gracefully
695a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
696a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#enableNetwork(int, boolean, int)},
697a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#disableNetwork(int, int)},
698a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and
699a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#checkAndUpdateLastConnectUid(int, int)}.
700a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
701a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
702a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testChangeConfigurationWithInvalidNetworkId() {
703a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
704a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
705a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
706a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
707a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertFalse(mWifiConfigManager.enableNetwork(
708a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId() + 1, false, TEST_CREATOR_UID));
70922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertFalse(mWifiConfigManager.disableNetwork(result.getNetworkId() + 1, TEST_CREATOR_UID));
710a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.updateNetworkSelectionStatus(
71122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                result.getNetworkId() + 1, NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER));
712a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.checkAndUpdateLastConnectUid(
71322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                result.getNetworkId() + 1, TEST_CREATOR_UID));
714a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
715a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
716a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
7171fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies multiple modification of a single network using
718a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
7191fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * This test is basically checking if the apps can reset some of the fields of the config after
7201fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * addition. The fields being reset in this test are the |preSharedKey| and |wepKeys|.
7211fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 1. Create an open network initially.
7221fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 2. Modify the added network config to a WEP network config with all the 4 keys set.
7231fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 3. Modify the added network config to a WEP network config with only 1 key set.
7241fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 4. Modify the added network config to a PSK network config.
7251fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
7261fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
7271fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testMultipleUpdatesSingleNetwork() {
7281fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createOpenNetwork();
7291fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
7301fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7311fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now add |wepKeys| to the network. We don't need to update the |allowedKeyManagement|
7321fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // fields for open to WEP conversion.
7331fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        String[] wepKeys =
7341fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                Arrays.copyOf(WifiConfigurationTestUtil.TEST_WEP_KEYS,
7351fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                        WifiConfigurationTestUtil.TEST_WEP_KEYS.length);
7361fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        int wepTxKeyIdx = WifiConfigurationTestUtil.TEST_WEP_TX_KEY_INDEX;
7371fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
7381fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7391fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
7401fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
7411fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
7421fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7431fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now empty out 3 of the |wepKeys[]| and ensure that those keys have been reset correctly.
7441fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        for (int i = 1; i < network.wepKeys.length; i++) {
7451fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            wepKeys[i] = "";
7461fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        }
7471fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepTxKeyIdx = 0;
7481fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
7491fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7501fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
7511fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
7521fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
7531fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7541fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now change the config to a PSK network config by resetting the remaining |wepKey[0]|
7551fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // field and setting the |preSharedKey| and |allowedKeyManagement| fields.
7561fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepKeys[0] = "";
7571fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepTxKeyIdx = -1;
7581fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
7591fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
7601fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkPreSharedKey(network, WifiConfigurationTestUtil.TEST_PSK);
7611fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7621fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
7631fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
7641fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
7651fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
7661fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7671fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
7681fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies the modification of a WifiEnteriseConfig using
769a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
7701fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
7711fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
7721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testUpdateWifiEnterpriseConfig() {
7731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
7741fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
7751fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7761fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Set the |password| field in WifiEnterpriseConfig and modify the config to PEAP/GTC.
7771fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig =
7781fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
7791fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkEnterprisePassword(network, "test");
7801fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7811fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
7821fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
7831fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
7841fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7851fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Reset the |password| field in WifiEnterpriseConfig and modify the config to TLS/None.
7861fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
7871fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
7881fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkEnterprisePassword(network, "");
7891fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7901fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
7911fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
7921fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
7931fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
7941fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7951fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
7961fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies the modification of a single network using
797a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} by passing in nulls
7981fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * in all the publicly exposed fields.
7991fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
8001fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
8011fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testUpdateSingleNetworkWithNullValues() {
8021fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
8031fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
8041fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8051fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Save a copy of the original network for comparison.
8061fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration originalNetwork = new WifiConfiguration(network);
8071fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8081fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now set all the public fields to null and try updating the network.
8091fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedAuthAlgorithms = null;
8101fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedProtocols = null;
8111fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedKeyManagement = null;
8121fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedPairwiseCiphers = null;
8131fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedGroupCiphers = null;
8141fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.setIpConfiguration(null);
8151fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig = null;
8161fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8171fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
8181fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8191fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Copy over the updated debug params to the original network config before comparison.
8201fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.lastUpdateUid = network.lastUpdateUid;
8211fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.lastUpdateName = network.lastUpdateName;
8221fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.updateTime = network.updateTime;
8231fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8241fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now verify that there was no change to the network configurations.
8251fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8261fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                originalNetwork,
8271fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(originalNetwork.networkId));
8281fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
8291fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8301fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
8311230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     * Verifies that the modification of a single network using
832a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} does not modify
8331230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     * existing configuration if there is a failure.
8341230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     */
8351230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    @Test
8361230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    public void testUpdateSingleNetworkFailureDoesNotModifyOriginal() {
8371230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
8381230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        network.enterpriseConfig =
8391230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
8401230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
8411230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
8421230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Save a copy of the original network for comparison.
8431230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfiguration originalNetwork = new WifiConfiguration(network);
8441230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
8451230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Now modify the network's EAP method.
8461230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        network.enterpriseConfig =
8471230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                WifiConfigurationTestUtil.createTLSWifiEnterpriseConfigWithNonePhase2();
8481230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
8491230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Fail this update because of cert installation failure.
8501230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        when(mWifiKeyStore
8511230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                .updateNetworkKeys(any(WifiConfiguration.class), any(WifiConfiguration.class)))
8521230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                .thenReturn(false);
8531230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        NetworkUpdateResult result =
8541230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(network, TEST_UPDATE_UID);
8551230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        assertTrue(result.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
8561230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
8571230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Now verify that there was no change to the network configurations.
8581230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8591230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                originalNetwork,
8601230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(originalNetwork.networkId));
8611230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    }
8621230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
8631230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    /**
86422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies the matching of networks with different encryption types with the
86522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * corresponding scan detail using
866a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)}.
86722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * The test also verifies that the provided scan detail was cached,
86822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
86922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
87022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testMatchScanDetailToNetworksAndCache() {
87122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Create networks of different types and ensure that they're all matched using
87222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // the corresponding ScanDetail correctly.
87322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
87422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createOpenNetwork());
87522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
87622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createWepNetwork());
87722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
87822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createPskNetwork());
87922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
88022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createEapNetwork());
88122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
88222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
88322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
88422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies that scan details with wrong SSID/authentication types are not matched using
885a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)}
88622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * to the added networks.
88722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
88822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
88922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testNoMatchScanDetailToNetwork() {
89022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // First create networks of different types.
89122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
89222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
89322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
89422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
89522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
89622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now add them to WifiConfigManager.
89722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
89822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
89922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
90022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(eapNetwork);
90122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
90222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now create dummy scan detail corresponding to the networks.
90322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail openNetworkScanDetail = createScanDetailForNetwork(openNetwork);
90422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail wepNetworkScanDetail = createScanDetailForNetwork(wepNetwork);
90522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail pskNetworkScanDetail = createScanDetailForNetwork(pskNetwork);
90622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail eapNetworkScanDetail = createScanDetailForNetwork(eapNetwork);
90722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
90822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now mix and match parameters from different scan details.
90922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        openNetworkScanDetail.getScanResult().SSID =
91022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                wepNetworkScanDetail.getScanResult().SSID;
91122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        wepNetworkScanDetail.getScanResult().capabilities =
91222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                pskNetworkScanDetail.getScanResult().capabilities;
91322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        pskNetworkScanDetail.getScanResult().capabilities =
91422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                eapNetworkScanDetail.getScanResult().capabilities;
91522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        eapNetworkScanDetail.getScanResult().capabilities =
91622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                openNetworkScanDetail.getScanResult().capabilities;
91722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
91822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Try to lookup a saved network using the modified scan details. All of these should fail.
91922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(openNetworkScanDetail));
92022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(wepNetworkScanDetail));
92122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(pskNetworkScanDetail));
92222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eapNetworkScanDetail));
92322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
92422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // All the cache's should be empty as well.
92522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId));
92622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(wepNetwork.networkId));
92722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(pskNetwork.networkId));
92822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(eapNetwork.networkId));
92922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
93022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
93122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
93222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies that scan detail cache is trimmed down when the size of the cache for a network
933a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * exceeds {@link WifiConfigManager#SCAN_CACHE_ENTRIES_MAX_SIZE}.
93422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
93522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
93622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testScanDetailCacheTrimForNetwork() {
93722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Add a single network.
93822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
93922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
94022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
94122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetailCache scanDetailCache;
94222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        String testBssidPrefix = "00:a5:b8:c9:45:";
94322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
94422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Modify |BSSID| field in the scan result and add copies of scan detail
94522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // |SCAN_CACHE_ENTRIES_MAX_SIZE| times.
94622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        int scanDetailNum = 1;
947a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        for (; scanDetailNum <= WifiConfigManager.SCAN_CACHE_ENTRIES_MAX_SIZE; scanDetailNum++) {
94822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // Create dummy scan detail caches with different BSSID for the network.
94922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            ScanDetail scanDetail =
95022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    createScanDetailForNetwork(
95122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                            openNetwork, String.format("%s%02x", testBssidPrefix, scanDetailNum));
95222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            assertNotNull(
95322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail));
95422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
95522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // The size of scan detail cache should keep growing until it hits
95622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // |SCAN_CACHE_ENTRIES_MAX_SIZE|.
95722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            scanDetailCache =
95822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId);
95922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            assertEquals(scanDetailNum, scanDetailCache.size());
96022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        }
96122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
96222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now add the |SCAN_CACHE_ENTRIES_MAX_SIZE + 1| entry. This should trigger the trim.
96322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail scanDetail =
96422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                createScanDetailForNetwork(
96522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                        openNetwork, String.format("%s%02x", testBssidPrefix, scanDetailNum));
96622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail));
96722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
96822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Retrieve the scan detail cache and ensure that the size was trimmed down to
96922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // |SCAN_CACHE_ENTRIES_TRIM_SIZE + 1|. The "+1" is to account for the new entry that
97022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // was added after the trim.
97122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        scanDetailCache = mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId);
972a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        assertEquals(WifiConfigManager.SCAN_CACHE_ENTRIES_TRIM_SIZE + 1, scanDetailCache.size());
97322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
97422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
97522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
9762d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is false for a newly added network.
9772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
9782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
9792d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testAddNetworkHasEverConnectedFalse() {
9802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(WifiConfigurationTestUtil.createOpenNetwork());
9812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
9822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
9832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
9842d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is false for a newly added network even when new config has
9852d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * mistakenly set HasEverConnected to true.
9862d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
9872d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
9882d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testAddNetworkOverridesHasEverConnectedWhenTrueInNewConfig() {
9892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
9902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
9912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(openNetwork);
9922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
9932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
9942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
9952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verify that the |HasEverConnected| is set when
996a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkAfterConnect(int)} is invoked.
9972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
9982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
999cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius    public void testUpdateConfigAfterConnectHasEverConnectedTrue() {
10002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
10012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(openNetwork);
10022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(openNetwork.networkId);
10032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |preSharedKey| is updated.
10072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdatePreSharedKeyClearsHasEverConnected() {
10102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
10112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
10122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
10132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different psk.
10152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.preSharedKey.equals("newpassword"));
10162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.preSharedKey = "newpassword";
10172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
10182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |wepKeys| is updated.
10222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateWepKeysClearsHasEverConnected() {
10252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
10262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(wepNetwork);
10272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(wepNetwork.networkId);
10282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different wep.
10302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(wepNetwork.wepKeys[0].equals("newpassword"));
10312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        wepNetwork.wepKeys[0] = "newpassword";
10322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(wepNetwork);
10332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |wepTxKeyIndex| is updated.
10372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateWepTxKeyClearsHasEverConnected() {
10402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
10412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(wepNetwork);
10422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(wepNetwork.networkId);
10432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10442d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different wep.
10452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(wepNetwork.wepTxKeyIndex == 3);
10462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        wepNetwork.wepTxKeyIndex = 3;
10472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(wepNetwork);
10482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedKeyManagement| is
10522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
10532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedKeyManagementClearsHasEverConnected() {
10562d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
10572d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
10582d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
10592d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10602d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
10612d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
10622d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
10632d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10642d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10652d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10662d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedProtocol| is
10672d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
10682d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10692d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10702d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateProtocolsClearsHasEverConnected() {
10712d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
10722d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
10732d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
10742d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10752d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedProtocols.get(WifiConfiguration.Protocol.OSEN));
10762d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedProtocols.set(WifiConfiguration.Protocol.OSEN);
10772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
10782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10792d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedAuthAlgorithms| is
10822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
10832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10842d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10852d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedAuthAlgorithmsClearsHasEverConnected() {
10862d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
10872d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
10882d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
10892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedAuthAlgorithms.get(WifiConfiguration.AuthAlgorithm.LEAP));
10912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.LEAP);
10922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
10932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedPairwiseCiphers| is
10972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
10982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedPairwiseCiphersClearsHasEverConnected() {
11012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.NONE));
11062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.NONE);
11072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedGroup| is
11122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedGroupCiphersClearsHasEverConnected() {
11162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue(pskNetwork.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.WEP104));
11212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedGroupCiphers.clear(WifiConfiguration.GroupCipher.WEP104);
11222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |hiddenSSID| is
11272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateHiddenSSIDClearsHasEverConnected() {
11312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.hiddenSSID);
11362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.hiddenSSID = true;
11372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is not cleared when a network config |requirePMF| is
11422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11442d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateRequirePMFDoesNotClearHasEverConnected() {
11462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.requirePMF);
11512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.requirePMF = true;
11522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result =
11542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(pskNetwork);
11552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
11562d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
11572d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue("Updating network non-credentials config should not clear hasEverConnected.",
11582d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
11592d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11602d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11612d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11622d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |enterpriseConfig| is
11632d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11642d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11652d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11662d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateEnterpriseConfigClearsHasEverConnected() {
11672d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
11682d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        eapNetwork.enterpriseConfig =
11692d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
11702d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(eapNetwork);
11712d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(eapNetwork.networkId);
11722d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11732d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(eapNetwork.enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS);
11742d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        eapNetwork.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
11752d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(eapNetwork);
11762d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
1179fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius     * Verifies the ordering of network list generated using
1180a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#retrievePnoNetworkList()}.
1181fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius     */
1182fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    @Test
1183fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    public void testRetrievePnoList() {
1184fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Create and add 3 networks.
1185fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork();
1186fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
1187fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
1188fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network1);
1189fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network2);
1190fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network3);
1191fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1192fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Enable all of them.
1193a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network1.networkId, false, TEST_CREATOR_UID));
1194a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network2.networkId, false, TEST_CREATOR_UID));
1195a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network3.networkId, false, TEST_CREATOR_UID));
1196fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1197fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now set scan results in 2 of them to set the corresponding
1198fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
1199fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
1200fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
1201fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
1202fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
1203fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1204fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now increment |network3|'s association count. This should ensure that this network
1205fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // is preferred over |network1|.
1206fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
1207fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1208fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Retrieve the Pno network list & verify the order of the networks returned.
1209fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
1210fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                mWifiConfigManager.retrievePnoNetworkList();
1211fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(3, pnoNetworks.size());
1212fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network3.SSID, pnoNetworks.get(0).ssid);
1213fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network1.SSID, pnoNetworks.get(1).ssid);
1214fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network2.SSID, pnoNetworks.get(2).ssid);
1215fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1216fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now permanently disable |network3|. This should remove network 3 from the list.
1217fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.disableNetwork(network3.networkId, TEST_CREATOR_UID));
1218fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1219fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Retrieve the Pno network list again & verify the order of the networks returned.
1220fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        pnoNetworks = mWifiConfigManager.retrievePnoNetworkList();
1221fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(2, pnoNetworks.size());
1222fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network1.SSID, pnoNetworks.get(0).ssid);
1223fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network2.SSID, pnoNetworks.get(1).ssid);
1224fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    }
1225fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1226fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    /**
12278600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have the same default GW Mac address in
1228a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
12298600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
12308600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
12318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingGwMacAddress() {
12328600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
12338600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
12348600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
12358600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
12368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
12378600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
12388600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12398600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Set the same default GW mac address for all of the networks.
12408600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
12418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
12428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
12438600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
12448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
12458600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network3.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
12468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now create dummy scan detail corresponding to the networks.
12488600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1);
12498600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2);
12508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail3 = createScanDetailForNetwork(network3);
12518600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12528600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
12538600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
12548600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
12558600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
12568600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail3));
12578600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12588600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
12598600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
12608600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
12618600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(2, network.linkedConfigurations.size());
12628600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
12638600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
12648600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
12658600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
12668600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
12678600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
12688600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
12698600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
12708600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12718600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
12728600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have scan results with same first 16 ASCII of
12738600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * bssid in
1274a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
12758600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
12768600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
12778600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingBSSIDMatch() {
12788600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
12798600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
12808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
12818600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
12828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
12838600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
12848600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
12868600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
12878600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
12888600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail3 = createScanDetailForNetwork(network3, "af:89:56:34:56:69");
12898600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12908600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
12918600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
12928600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
12938600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
12948600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail3));
12958600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
12968600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
12978600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
12988600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
12998600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(2, network.linkedConfigurations.size());
13008600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
13018600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
13028600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
13038600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
13048600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
13058600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
13068600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
13078600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
13088600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13098600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
13108600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks does not happen for non WPA networks when they have scan
13118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * results with same first 16 ASCII of bssid in
1312a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
13138600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
13148600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
13158600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNoNetworkLinkUsingBSSIDMatchForNonWpaNetworks() {
13168600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
13178600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
13188600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
13198600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
13208600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13218600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
13228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
13238600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
13248600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13258600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
13268600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
13278600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13288600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
13298600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
13308600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
13318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
13328600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
13338600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
13348600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13358600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
13368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks does not happen for networks with more than
1337a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#LINK_CONFIGURATION_MAX_SCAN_CACHE_ENTRIES} scan
13388600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * results with same first 16 ASCII of bssid in
1339a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
13408600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
13418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
13428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNoNetworkLinkUsingBSSIDMatchForNetworksWithHighScanDetailCacheSize() {
13438600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
13448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
13458600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
13468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
13478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13488600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create 7 scan results with bssid which is different in only the last char.
13498600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
13508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        int scan_result_num = 0;
1351a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        for (; scan_result_num < WifiConfigManager.LINK_CONFIGURATION_MAX_SCAN_CACHE_ENTRIES + 1;
13522dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius             scan_result_num++) {
13538600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            ScanDetail networkScanDetail =
13548600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    createScanDetailForNetwork(
13558600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                            network1, test_bssid_base + Integer.toString(scan_result_num));
13568600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNotNull(
13578600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
13588600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
13598600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13608600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now add 1 scan result to the other network with bssid which is different in only the
13618600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // last char.
13628600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 =
13638600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(
13648600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                        network2, test_bssid_base + Integer.toString(scan_result_num++));
13658600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
13668600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13678600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
13688600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
13698600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
13708600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
13718600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
13728600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
13738600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13748600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
13758600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have scan results with same first 16 ASCII of
1376a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * bssid in {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}
13778600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * and then subsequently delinked when the networks have default gateway set which do not match.
13788600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
13798600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
13808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingBSSIDMatchAndThenUnlinkDueToGwMacAddress() {
13818600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
13828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
13838600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
13848600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
13858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13868600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
13878600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
13888600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
13898600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13908600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
13918600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
13928600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
13938600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
13948600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13958600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
13968600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
13978600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
13988600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(1, network.linkedConfigurations.size());
13998600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
14008600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
14018600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
14028600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
14038600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
14048600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
14058600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
14068600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14078600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now Set different GW mac address for both the networks and ensure they're unlinked.
14088600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14098600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network1.networkId, "de:ad:fe:45:23:34"));
14108600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network2.networkId, "ad:de:fe:45:23:34"));
14128600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14138600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Add some dummy scan results again to re-evaluate the linking of networks.
14148600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
14158600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(network1, "af:89:56:34:45:67")));
14168600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
14178600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(network1, "af:89:56:34:45:68")));
14188600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14198600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworks();
14208600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
14218600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
14228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
14238600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
14248600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /*
14262dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
1427a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long)}.
14282dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
14292dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
14302dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetwork() {
14312dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
14322dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
14332dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14342dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
14352dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
14362dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
14372dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
14382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
14392dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
14402dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
14412dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
14422dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14432dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
14442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
14452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network.networkId, 1));
14462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
14472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14482dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
14492dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
1450a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long)} and ensures
14512dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * that scan results which have a timestamp  beyond the provided age are not used in the
14522dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * channel list.
14532dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
14542dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
14552dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIgnoresStaleScanResults() {
14562dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
14572dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
14582dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14592dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        long wallClockBase = 0;
14602dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
14612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
14622dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
14632dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            // Increment the seen value in the scan results for each of them.
14642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            when(mClock.getWallClockMillis()).thenReturn(wallClockBase + i);
14652dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
14662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
14672dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
14682dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
14692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
14702dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14712dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
14722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int ageInMillis = 4;
14732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Now fetch only scan results which are 4 millis stale. This should ignore the first
14742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // scan result.
14752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(
14762dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                new HashSet<>(Arrays.asList(
14772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        Arrays.copyOfRange(
14782dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                                TEST_FREQ_LIST,
14792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                                TEST_FREQ_LIST.length - ageInMillis, TEST_FREQ_LIST.length))),
14802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
14812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        network.networkId, ageInMillis));
14822dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
14832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
14852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
1486a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long)} and ensures
14872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * that the list size does not exceed the max configured for the device.
14882dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
14892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
14902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIsLimitedToConfiguredSize() {
1491a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        // Need to recreate the WifiConfigManager instance for this test to modify the config
14922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // value which is read only in the constructor.
14932dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int maxListSize = 3;
14942dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
14952dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
14962dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                maxListSize);
14972dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
14982dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
14992dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
15002dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
15012dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15022dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
15032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
15042dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
15052dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
15062dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
15072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
15082dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
15092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
15102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15112dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
15122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Ensure that the fetched list size is limited.
15132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
15142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
15152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        network.networkId, 1).size());
15162dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
15172dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
15192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
1520a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long)} and ensures
15212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * that scan results from linked networks are used in the channel list.
15222dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
15232dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
15242dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIncludesLinkedNetworks() {
15252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
15262dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
15272dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
15282dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
15292dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15302dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
15312dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int TEST_FREQ_LISTIdx = 0;
15322dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 1.
15332dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
15342dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
15352dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
15362dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
15372dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
15382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
15392dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
15402dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15412dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
15422dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 2.
15432dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
15442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
15452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
15462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
15472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
15482dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
15492dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
15502dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
15512dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15522dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Link the 2 configurations together using the GwMacAddress.
15532dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
15542dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
15552dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
15562dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
15572dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15582dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // The channel list fetched should include scan results from both the linked networks.
15592dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
15602dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network1.networkId, 1));
15612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
15622dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network2.networkId, 1));
15632dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
15642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15652dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
15662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
1567a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long)} and ensures
15682dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * that scan results from linked networks are used in the channel list and that the list size
15692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * does not exceed the max configured for the device.
15702dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
15712dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
15722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIncludesLinkedNetworksIsLimitedToConfiguredSize() {
1573a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        // Need to recreate the WifiConfigManager instance for this test to modify the config
15742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // value which is read only in the constructor.
15752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int maxListSize = 3;
15762dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
15772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
15782dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                maxListSize);
15792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
15812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
15822dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
15832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
15842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
15852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15862dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
15872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int TEST_FREQ_LISTIdx = 0;
15882dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 1.
15892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
15902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
15912dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
15922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
15932dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
15942dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
15952dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
15962dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15972dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
15982dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 2.
15992dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
16002dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
16012dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
16022dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
16032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
16042dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
16052dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
16062dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
16072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16082dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Link the 2 configurations together using the GwMacAddress.
16092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
16102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
16112dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
16122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
16132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Ensure that the fetched list size is limited.
16152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
16162dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
16172dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        network1.networkId, 1).size());
16182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
16192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
16202dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        network2.networkId, 1).size());
16212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
16222dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
1623c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
1624a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
1625c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * and ensures that any non current user private networks are moved to shared store file.
1626c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
1627c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
1628c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchPushesOtherPrivateNetworksToSharedStore() throws Exception {
16296d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
16306d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
1631c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
1632c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1633c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        int appId = 674;
1634c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1635c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
1636c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
1637c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user1Network.shared = false;
1638c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
1639c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
1640c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user2Network.shared = false;
1641c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
1642c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
1643c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1644c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Set up the store data first that is loaded.
1645c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
1646c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
1647c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(sharedNetwork);
1648c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user2Network);
1649c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
1650c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
1651c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> userNetworks = new ArrayList<WifiConfiguration>() {
1652c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
1653c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user1Network);
1654c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
1655c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
1656c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigStoreData loadStoreData =
1657c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                new WifiConfigStoreData(sharedNetworks, userNetworks, new HashSet<String>());
1658c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mWifiConfigStore.read()).thenReturn(loadStoreData);
1659c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1660c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now switch the user to user2
1661c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
1662c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1663c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Set the expected network list before comparing. user1Network should be in shared data.
1664c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Note: In the real world, user1Network will no longer be visible now because it should
1665c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // already be in user1's private store file. But, we're purposefully exposing it
1666c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // via |loadStoreData| to test if other user's private networks are pushed to shared store.
1667c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> expectedSharedNetworks = new ArrayList<WifiConfiguration>() {
1668c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
1669c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(sharedNetwork);
1670c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user1Network);
1671c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
1672c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
1673c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> expectedUserNetworks = new ArrayList<WifiConfiguration>() {
1674c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
1675c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user2Network);
1676c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
1677c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
1678c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Capture the written data for the old user and ensure that it was empty.
1679c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigStoreData writtenStoreData = captureWriteStoreData();
1680c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        assertTrue(writtenStoreData.getConfigurations().isEmpty());
1681c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1682c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now capture the next written data and ensure that user1Network is now in shared data.
1683c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        writtenStoreData = captureWriteStoreData();
1684c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
1685c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                expectedSharedNetworks, writtenStoreData.getSharedConfigurations());
1686c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
1687c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                expectedUserNetworks, writtenStoreData.getUserConfigurations());
1688c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
1689c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1690c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
1691a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
1692a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * and {@link WifiConfigManager#handleUserUnlock(int)} and ensures that the new store is
1693c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * read immediately if the user is unlocked during the switch.
1694c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
1695c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
1696c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchWhenUnlocked() throws Exception {
16976d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
16986d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
1699c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
1700c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1701c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mWifiConfigStore.read()).thenReturn(
1702c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                new WifiConfigStoreData(
1703c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
1704c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new HashSet<String>()));
1705c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1706c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // user2 is unlocked and switched to foreground.
1707c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
1708c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
1709c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Ensure that the read was invoked.
1710c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).read();
1711c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
1712c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1713c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
1714a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
1715a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * and {@link WifiConfigManager#handleUserUnlock(int)} and ensures that the new store is not
1716c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * read until the user is unlocked.
1717c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
1718c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchWhenLocked() throws Exception {
17196d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
17206d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
1721c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
1722c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1723c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // user2 is locked and switched to foreground.
1724c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
1725c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
1726c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1727c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Ensure that the read was not invoked.
1728c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
1729c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1730c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now try unlocking some other user (user1), this should be ignored.
1731c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserUnlock(user1);
1732c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
1733c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1734c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mWifiConfigStore.read()).thenReturn(
1735c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                new WifiConfigStoreData(
1736c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
1737c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new HashSet<String>()));
1738c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1739c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Unlock the user2 and ensure that we read the data now.
1740c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserUnlock(user2);
1741c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).read();
1742c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
1743c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1744c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
1745a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies that the foreground user stop using {@link WifiConfigManager#handleUserStop(int)}
1746c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * and ensures that the store is written only when the foreground user is stopped.
1747c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
1748c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
1749c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserStop() throws Exception {
17506d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
17516d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
1752c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
1753c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1754c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Try stopping background user2 first, this should not do anything.
1755c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
1756c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserStop(user2);
1757c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
1758c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1759c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now try stopping the foreground user1, this should trigger a write to store.
1760c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserStop(user1);
1761c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
1762c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(
1763c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                anyBoolean(), any(WifiConfigStoreData.class));
1764c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
1765c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
17666d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    /**
1767b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)}
1768b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * results in a store read after bootup.
1769b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     */
1770b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    @Test
1771b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    public void testHandleUserUnlockAfterBootup() throws Exception {
1772b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user1 = TEST_DEFAULT_USER;
1773b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1774b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        when(mWifiConfigStore.read()).thenReturn(
1775b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                new WifiConfigStoreData(
1776b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
1777b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new HashSet<String>()));
1778b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1779b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Unlock the user1 (default user) for the first time and ensure that we read the data.
1780b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
1781b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).read();
1782b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    }
1783b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1784b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    /**
1785b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)} does
1786b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * not always result in a store read unless the user had switched or just booted up.
1787b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     */
1788b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    @Test
1789b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    public void testHandleUserUnlockWithoutSwitchOrBootup() throws Exception {
1790b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user1 = TEST_DEFAULT_USER;
1791b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
1792b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        setupUserProfiles(user2);
1793b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1794b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        when(mWifiConfigStore.read()).thenReturn(
1795b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                new WifiConfigStoreData(
1796b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
1797b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new HashSet<String>()));
1798b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1799b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // user2 is unlocked and switched to foreground.
1800b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
1801b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserSwitch(user2);
1802b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Ensure that the read was invoked.
1803b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).read();
1804b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1805b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Unlock the user2 again and ensure that we don't read the data now.
1806b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserUnlock(user2);
1807b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
1808b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    }
1809b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
1810b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    /**
18116d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * Verifies the private network addition using
1812a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
18136d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * by a non foreground user is rejected.
18146d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     */
18156d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    @Test
18166d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    public void testAddNetworkUsingBackgroundUserUId() throws Exception {
18176d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
18186d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(user2);
18196d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
18206d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int creatorUid = UserHandle.getUid(user2, 674);
18216d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
18226d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Create a network for user2 try adding it. This should be rejected.
18236d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
18246d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        NetworkUpdateResult result =
18256d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(user2Network, creatorUid);
18266d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertFalse(result.isSuccess());
18276d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    }
18286d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
18296d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    /**
18306d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * Verifies the private network addition using
1831a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
18326d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * by SysUI is always accepted.
18336d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     */
18346d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    @Test
18356d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    public void testAddNetworkUsingSysUiUid() throws Exception {
18366d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Set up the user profiles stuff. Needed for |WifiConfigurationUtil.isVisibleToAnyProfile|
18376d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
18386d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(user2);
18396d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
18406d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
18416d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
18426d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
18436d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Create a network for user2 try adding it. This should be rejected.
18446d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
18456d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        NetworkUpdateResult result =
18466d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(user2Network, TEST_SYSUI_UID);
18476d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertTrue(result.isSuccess());
18486d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    }
18496d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
18503a738a26918230b2469d917dbf14323234edd39bRoshan Pius    /**
1851a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#loadFromStore()} attempts
18523a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * to migrate data from legacy stores when the new store files are absent.
18533a738a26918230b2469d917dbf14323234edd39bRoshan Pius     */
18543a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Test
18553a738a26918230b2469d917dbf14323234edd39bRoshan Pius    public void testMigrationFromLegacyStore() throws Exception {
18563a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Create the store data to be returned from legacy stores.
18573a738a26918230b2469d917dbf14323234edd39bRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
18583a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createPskNetwork());
18593a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createEapNetwork());
18603a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createWepNetwork());
1861674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        String deletedEphemeralSSID = "EphemeralSSID";
1862674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        Set<String> deletedEphermalSSIDs = new HashSet<>(Arrays.asList(deletedEphemeralSSID));
18633a738a26918230b2469d917dbf14323234edd39bRoshan Pius        WifiConfigStoreDataLegacy storeData =
1864674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius                new WifiConfigStoreDataLegacy(networks, deletedEphermalSSIDs);
18653a738a26918230b2469d917dbf14323234edd39bRoshan Pius
18663a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // New store files not present, so migrate from the old store.
18673a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(false);
18683a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(true);
18693a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.read()).thenReturn(storeData);
18703a738a26918230b2469d917dbf14323234edd39bRoshan Pius
18713a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Now trigger a load from store. This should populate the in memory list with all the
18723a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // networks above from the legacy store.
18733a738a26918230b2469d917dbf14323234edd39bRoshan Pius        mWifiConfigManager.loadFromStore();
18743a738a26918230b2469d917dbf14323234edd39bRoshan Pius
18753a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStore, never()).read();
18763a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStoreLegacy).read();
18773a738a26918230b2469d917dbf14323234edd39bRoshan Pius
18783a738a26918230b2469d917dbf14323234edd39bRoshan Pius        List<WifiConfiguration> retrievedNetworks =
18793a738a26918230b2469d917dbf14323234edd39bRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
18803a738a26918230b2469d917dbf14323234edd39bRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
18813a738a26918230b2469d917dbf14323234edd39bRoshan Pius                networks, retrievedNetworks);
1882674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        assertTrue(mWifiConfigManager.wasEphemeralNetworkDeleted(deletedEphemeralSSID));
18833a738a26918230b2469d917dbf14323234edd39bRoshan Pius    }
18843a738a26918230b2469d917dbf14323234edd39bRoshan Pius
18853a738a26918230b2469d917dbf14323234edd39bRoshan Pius    /**
1886a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#loadFromStore()} does
18873a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * not attempt to read from any of the stores (new or legacy) when the store files are
18883a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * not present.
18893a738a26918230b2469d917dbf14323234edd39bRoshan Pius     */
18903a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Test
18913a738a26918230b2469d917dbf14323234edd39bRoshan Pius    public void testFreshInstallDoesNotLoadFromStore() throws Exception {
18923a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // New store files not present, so migrate from the old store.
18933a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(false);
18943a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(false);
18953a738a26918230b2469d917dbf14323234edd39bRoshan Pius
18963a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Now trigger a load from store. This should populate the in memory list with all the
18973a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // networks above.
18983a738a26918230b2469d917dbf14323234edd39bRoshan Pius        mWifiConfigManager.loadFromStore();
18993a738a26918230b2469d917dbf14323234edd39bRoshan Pius
19003a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStore, never()).read();
19013a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStoreLegacy, never()).read();
19023a738a26918230b2469d917dbf14323234edd39bRoshan Pius
19033a738a26918230b2469d917dbf14323234edd39bRoshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworksWithPasswords().isEmpty());
19043a738a26918230b2469d917dbf14323234edd39bRoshan Pius    }
19053a738a26918230b2469d917dbf14323234edd39bRoshan Pius
1906a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    /**
1907a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius     * Verifies that the last user selected network parameter is set when
1908a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} with disableOthers flag is set
1909a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * to true and cleared when either {@link WifiConfigManager#disableNetwork(int, int)} or
1910a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int, int)} is invoked using the same network ID.
1911a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius     */
1912a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    @Test
1913a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    public void testLastSelectedNetwork() throws Exception {
1914a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
1915a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
1916a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
1917a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        when(mClock.getElapsedSinceBootMillis()).thenReturn(67L);
1918a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
1919a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), true, TEST_CREATOR_UID));
1920a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(result.getNetworkId(), mWifiConfigManager.getLastSelectedNetwork());
1921a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(67, mWifiConfigManager.getLastSelectedTimeStamp());
1922a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
1923a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        // Now disable the network and ensure that the last selected flag is cleared.
1924a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_CREATOR_UID));
1925a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(
1926a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                WifiConfiguration.INVALID_NETWORK_ID, mWifiConfigManager.getLastSelectedNetwork());
1927a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
1928a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        // Enable it again and remove the network to ensure that the last selected flag was cleared.
1929a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
1930a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), true, TEST_CREATOR_UID));
1931a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(result.getNetworkId(), mWifiConfigManager.getLastSelectedNetwork());
193265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertEquals(openNetwork.configKey(), mWifiConfigManager.getLastSelectedNetworkConfigKey());
1933a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
1934a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(result.getNetworkId(), TEST_CREATOR_UID));
1935a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(
1936a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                WifiConfiguration.INVALID_NETWORK_ID, mWifiConfigManager.getLastSelectedNetwork());
1937a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    }
1938a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
193965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    /**
194065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     * Verifies that all the networks for the provided app is removed when
1941a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetworksForApp(ApplicationInfo)} is invoked.
194265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     */
194365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    @Test
194465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    public void testRemoveNetworksForApp() throws Exception {
194565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createOpenNetwork());
194665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createPskNetwork());
194765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createWepNetwork());
194865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
194965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
195065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
195165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        ApplicationInfo app = new ApplicationInfo();
195265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        app.uid = TEST_CREATOR_UID;
195365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        app.packageName = TEST_CREATOR_NAME;
195465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.removeNetworksForApp(app));
195565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
195665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        // Ensure all the networks are removed now.
195765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
195865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    }
195965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
196065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    /**
196165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     * Verifies that all the networks for the provided user is removed when
1962a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetworksForUser(int)} is invoked.
196365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     */
196465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    @Test
196565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    public void testRemoveNetworksForUser() throws Exception {
196665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createOpenNetwork());
196765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createPskNetwork());
196865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createWepNetwork());
196965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
197065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
197165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
197265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.removeNetworksForUser(TEST_DEFAULT_USER));
197365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
197465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        // Ensure all the networks are removed now.
197565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
197665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    }
197765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
1978b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    /**
1979b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius     * Verifies that the connect choice is removed from all networks when
1980a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int, int)} is invoked.
1981b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius     */
1982b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    @Test
1983b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    public void testRemoveNetworkRemovesConnectChoice() throws Exception {
1984b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
1985b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
1986b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
1987b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
1988b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
1989b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
1990b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
1991b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Set connect choice of network 2 over network 1.
1992b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(
1993b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                mWifiConfigManager.setNetworkConnectChoice(
1994b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                        network1.networkId, network2.configKey(), 78L));
1995b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
1996b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration retrievedNetwork =
1997b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                mWifiConfigManager.getConfiguredNetwork(network1.networkId);
1998b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertEquals(
1999b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2000b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2001b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2002b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Remove network 3 and ensure that the connect choice on network 1 is not removed.
2003b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(mWifiConfigManager.removeNetwork(network3.networkId, TEST_CREATOR_UID));
2004b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2005b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertEquals(
2006b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2007b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2008b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2009b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Now remove network 2 and ensure that the connect choice on network 1 is removed..
2010b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(mWifiConfigManager.removeNetwork(network2.networkId, TEST_CREATOR_UID));
2011b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2012b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertNotEquals(
2013b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2014b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2015cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius
2016cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        // This should have triggered 2 buffered writes. 1 for setting the connect choice, 1 for
2017cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        // clearing it after network removal.
2018cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, times(2))
2019cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius                .write(eq(false), any(WifiConfigStoreData.class));
2020b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    }
2021b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
20220f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    /**
20230f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * Verifies that the modification of a single network using
20240f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and ensures that any
20250f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * updates to the network config in
20260f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * {@link WifiKeyStore#updateNetworkKeys(WifiConfiguration, WifiConfiguration)} is reflected
20270f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * in the internal database.
20280f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     */
20290f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    @Test
20300f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    public void testUpdateSingleNetworkWithKeysUpdate() {
20310f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
20320f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        network.enterpriseConfig =
20330f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
20340f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
20350f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
20360f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Now verify that network configurations match before we make any change.
20370f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
20380f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                network,
20390f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
20400f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
20410f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Modify the network ca_cert field in updateNetworkKeys method during a network
20420f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // config update.
20430f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        final String newCaCertAlias = "test";
20440f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        assertNotEquals(newCaCertAlias, network.enterpriseConfig.getCaCertificateAlias());
20450f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
20460f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        doAnswer(new AnswerWithArguments() {
20470f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius            public boolean answer(WifiConfiguration newConfig, WifiConfiguration existingConfig) {
20480f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                newConfig.enterpriseConfig.setCaCertificateAlias(newCaCertAlias);
20490f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                return true;
20500f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius            }
20510f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        }).when(mWifiKeyStore).updateNetworkKeys(
20520f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                any(WifiConfiguration.class), any(WifiConfiguration.class));
20530f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
20540f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
20550f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
20560f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Now verify that the keys update is reflected in the configuration fetched from internal
20570f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // db.
20580f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        network.enterpriseConfig.setCaCertificateAlias(newCaCertAlias);
20590f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
20600f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                network,
20610f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
20620f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    }
20630f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
206442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    /**
206542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     * Verifies that the dump method prints out all the saved network details with passwords masked.
206642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     * {@link WifiConfigManager#dump(FileDescriptor, PrintWriter, String[])}.
206742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     */
206842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    @Test
206942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    public void testDump() {
207042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
207142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
207242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        eapNetwork.enterpriseConfig.setPassword("blah");
207342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
207442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
207542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        verifyAddNetworkToWifiConfigManager(eapNetwork);
207642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
207742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        StringWriter stringWriter = new StringWriter();
207842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        mWifiConfigManager.dump(
207942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius                new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
208042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        String dumpString = stringWriter.toString();
208142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
208242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        // Ensure that the network SSIDs were dumped out.
208342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertTrue(dumpString.contains(pskNetwork.SSID));
208442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertTrue(dumpString.contains(eapNetwork.SSID));
208542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
208642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        // Ensure that the network passwords were not dumped out.
208742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertFalse(dumpString.contains(pskNetwork.preSharedKey));
208842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertFalse(dumpString.contains(eapNetwork.enterpriseConfig.getPassword()));
208942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    }
209042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
20915c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    /**
20925c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     * Verifies the ordering of network list generated using
20935c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     * {@link WifiConfigManager#retrieveHiddenNetworkList()}.
20945c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     */
20955c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    @Test
20965c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    public void testRetrieveHiddenList() {
20975c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Create and add 3 networks.
20985c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createWepHiddenNetwork();
20995c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskHiddenNetwork();
21005c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
21015c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
21025c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
21035c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
21045c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21055c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Enable all of them.
21065c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network1.networkId, false, TEST_CREATOR_UID));
21075c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network2.networkId, false, TEST_CREATOR_UID));
21085c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network3.networkId, false, TEST_CREATOR_UID));
21095c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21105c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now set scan results in 2 of them to set the corresponding
21115c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
21125c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
21135c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
21145c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
21155c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
21165c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21175c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now increment |network3|'s association count. This should ensure that this network
21185c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // is preferred over |network1|.
21195c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
21205c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21215c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Retrieve the hidden network list & verify the order of the networks returned.
21225c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        List<WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks =
21235c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                mWifiConfigManager.retrieveHiddenNetworkList();
21245c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(3, hiddenNetworks.size());
21255c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network3.SSID, hiddenNetworks.get(0).ssid);
21265c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network1.SSID, hiddenNetworks.get(1).ssid);
21275c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network2.SSID, hiddenNetworks.get(2).ssid);
21285c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21295c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now permanently disable |network3|. This should remove network 3 from the list.
21305c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.disableNetwork(network3.networkId, TEST_CREATOR_UID));
21315c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21325c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Retrieve the hidden network list again & verify the order of the networks returned.
21335c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        hiddenNetworks = mWifiConfigManager.retrieveHiddenNetworkList();
21345c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(2, hiddenNetworks.size());
21355c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network1.SSID, hiddenNetworks.get(0).ssid);
21365c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network2.SSID, hiddenNetworks.get(1).ssid);
21375c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    }
21385c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
21395c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    /**
21405c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * Verifies the addition of network configurations using
21415c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with same SSID and
21425c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * default key mgmt does not add duplicate network configs.
21435c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     */
21445c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    @Test
21455c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    public void testAddMultipleNetworksWithSameSSIDAndDefaultKeyMgmt() {
21465c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        final String ssid = "test_blah";
21475c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Add a network with the above SSID and default key mgmt and ensure it was added
21485c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // successfully.
21495c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network1 = new WifiConfiguration();
21505c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.SSID = ssid;
21515c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network1);
21525c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
21535c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
21545c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
21555c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> retrievedNetworks =
21565c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
21575c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
21585c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
21595c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network1, retrievedNetworks.get(0));
21605c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
21615c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Now add a second network with the same SSID and default key mgmt and ensure that it
21625c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // didn't add a new duplicate network.
21635c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network2 = new WifiConfiguration();
21645c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.SSID = ssid;
21655c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        result = addNetworkToWifiConfigManager(network2);
21665c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
21675c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertFalse(result.isNewNetwork());
21685c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
21695c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
21705c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
21715c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
21725c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network2, retrievedNetworks.get(0));
21735c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    }
21745c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
21755c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    /**
21765c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * Verifies the addition of network configurations using
21775c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with same SSID and
21785c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * different key mgmt should add different network configs.
21795c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     */
21805c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    @Test
21815c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    public void testAddMultipleNetworksWithSameSSIDAndDifferentKeyMgmt() {
21825c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        final String ssid = "test_blah";
21835c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Add a network with the above SSID and WPA_PSK key mgmt and ensure it was added
21845c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // successfully.
21855c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network1 = new WifiConfiguration();
21865c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.SSID = ssid;
21875c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
21885c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network1);
21895c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
21905c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
21915c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
21925c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> retrievedNetworks =
21935c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
21945c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
21955c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
21965c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network1, retrievedNetworks.get(0));
21975c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
21985c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Now add a second network with the same SSID and NONE key mgmt and ensure that it
21995c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // does add a new network.
22005c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network2 = new WifiConfiguration();
22015c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.SSID = ssid;
22025c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
22035c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        result = addNetworkToWifiConfigManager(network2);
22045c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
22055c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
22065c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
22075c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
22085c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(2, retrievedNetworks.size());
22095c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> networks = Arrays.asList(network1, network2);
22105c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
22115c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                networks, retrievedNetworks);
22125c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    }
22135c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
22142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private void createWifiConfigManager() {
22152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mWifiConfigManager =
2216a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                new WifiConfigManager(
221796241bee619ff7073635f680a36869f61a11a225Roshan Pius                        mContext, mFrameworkFacade, mClock, mUserManager, mTelephonyManager,
221896241bee619ff7073635f680a36869f61a11a225Roshan Pius                        mWifiKeyStore, mWifiConfigStore, mWifiConfigStoreLegacy);
22192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mWifiConfigManager.enableVerboseLogging(1);
22202dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
22212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
22228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
222350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * This method sets defaults in the provided WifiConfiguration object if not set
222450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * so that it can be used for comparison with the configuration retrieved from
222550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * WifiConfigManager.
222650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
222750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setDefaults(WifiConfiguration configuration) {
222850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedAuthAlgorithms.isEmpty()) {
222950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
223050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
223150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedProtocols.isEmpty()) {
223250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
223350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
223450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
223550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedKeyManagement.isEmpty()) {
223650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
223750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
223850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
223950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedPairwiseCiphers.isEmpty()) {
224050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
224150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
224250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
224350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedGroupCiphers.isEmpty()) {
224450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
224550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
224650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
224750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
224850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
224950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.getIpAssignment() == IpConfiguration.IpAssignment.UNASSIGNED) {
225050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
225150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
225250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.getProxySettings() == IpConfiguration.ProxySettings.UNASSIGNED) {
225350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.setProxySettings(IpConfiguration.ProxySettings.NONE);
225450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
22550ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        configuration.status = WifiConfiguration.Status.DISABLED;
22560ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        configuration.getNetworkSelectionStatus().setNetworkSelectionStatus(
22570ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius                NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
225850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
225950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
226050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
226150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided configuration with creator uid, package name
226250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * and time.
226350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
226450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setCreationDebugParams(WifiConfiguration configuration) {
226550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creatorUid = configuration.lastUpdateUid = TEST_CREATOR_UID;
226650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creatorName = configuration.lastUpdateName = TEST_CREATOR_NAME;
226750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creationTime = configuration.updateTime =
2268a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.createDebugTimeStampString(
226950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                        TEST_WALLCLOCK_CREATION_TIME_MILLIS);
227050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
227150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
227250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
227350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided configuration with update uid, package name
227450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * and time.
227550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
227650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setUpdateDebugParams(WifiConfiguration configuration) {
227750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.lastUpdateUid = TEST_UPDATE_UID;
227850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.lastUpdateName = TEST_UPDATE_NAME;
227950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.updateTime =
2280a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.createDebugTimeStampString(TEST_WALLCLOCK_UPDATE_TIME_MILLIS);
228150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
228250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
22831fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertNotEquals(Object expected, Object actual) {
22841fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        if (actual != null) {
22851fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            assertFalse(actual.equals(expected));
22861fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        } else {
22871fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            assertNotNull(expected);
22881fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        }
22891fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
22901fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
229150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
229250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided WifiConfiguration with the specified bssid value. Also, asserts that
229350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * the existing |BSSID| field is not the same value as the one being set
229450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
229550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void assertAndSetNetworkBSSID(WifiConfiguration configuration, String bssid) {
22961fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(bssid, configuration.BSSID);
229750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.BSSID = bssid;
229850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
229950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
230050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
230150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided WifiConfiguration with the specified |IpConfiguration| object. Also,
23021fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * asserts that the existing |mIpConfiguration| field is not the same value as the one being set
230350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
230450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void assertAndSetNetworkIpConfiguration(
230550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            WifiConfiguration configuration, IpConfiguration ipConfiguration) {
23061fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(ipConfiguration, configuration.getIpConfiguration());
230750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.setIpConfiguration(ipConfiguration);
230850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
230950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
231050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
23111fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified |wepKeys| value and
23121fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * |wepTxKeyIndex|.
23131fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
23141fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkWepKeysAndTxIndex(
23151fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String[] wepKeys, int wepTxKeyIdx) {
23161fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(wepKeys, configuration.wepKeys);
23171fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(wepTxKeyIdx, configuration.wepTxKeyIndex);
23181fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.wepKeys = Arrays.copyOf(wepKeys, wepKeys.length);
23191fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.wepTxKeyIndex = wepTxKeyIdx;
23201fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
23211fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
23221fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
23231fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified |preSharedKey| value.
23241fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
23251fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkPreSharedKey(
23261fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String preSharedKey) {
23271fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(preSharedKey, configuration.preSharedKey);
23281fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.preSharedKey = preSharedKey;
23291fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
23301fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
23311fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
23321fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified enteprise |password| value.
23331fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
23341fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkEnterprisePassword(
23351fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String password) {
23361fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(password, configuration.enterpriseConfig.getPassword());
23371fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.enterpriseConfig.setPassword(password);
23381fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
23391fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
23401fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
2341c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Helper method to capture the store data written in WifiConfigStore.write() method.
23426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
2343c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private WifiConfigStoreData captureWriteStoreData() {
23446e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        try {
23456e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            ArgumentCaptor<WifiConfigStoreData> storeDataCaptor =
23466e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    ArgumentCaptor.forClass(WifiConfigStoreData.class);
23476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            mContextConfigStoreMockOrder.verify(mWifiConfigStore)
23486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    .write(anyBoolean(), storeDataCaptor.capture());
2349c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            return storeDataCaptor.getValue();
23506e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        } catch (Exception e) {
23516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            fail("Exception encountered during write " + e);
23526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
2353c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        return null;
2354c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2355c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2356c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2357c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Returns whether the provided network was in the store data or not.
2358c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2359c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private boolean isNetworkInConfigStoreData(WifiConfiguration configuration) {
2360c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigStoreData storeData = captureWriteStoreData();
2361c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        if (storeData == null) {
2362c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            return false;
2363c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        }
2364c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        boolean foundNetworkInStoreData = false;
2365c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        for (WifiConfiguration retrievedConfig : storeData.getConfigurations()) {
2366c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            if (retrievedConfig.configKey().equals(configuration.configKey())) {
2367c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                foundNetworkInStoreData = true;
2368c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2369c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        }
2370c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        return foundNetworkInStoreData;
23716e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
23726e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
23736e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
23746e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the provided network was not present in the last config store write.
23756e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
23766e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkNotInConfigStoreData(WifiConfiguration configuration) {
23776e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(isNetworkInConfigStoreData(configuration));
23786e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
23796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
23806e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
23816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the provided network was present in the last config store write.
23826e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
23836e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkInConfigStoreData(WifiConfiguration configuration) {
23846e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(isNetworkInConfigStoreData(configuration));
23856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
23866e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
23876e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void assertPasswordsMaskedInWifiConfiguration(WifiConfiguration configuration) {
238822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (!TextUtils.isEmpty(configuration.preSharedKey)) {
2389a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius            assertEquals(WifiConfigManager.PASSWORD_MASK, configuration.preSharedKey);
23906e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
23916e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        if (configuration.wepKeys != null) {
23926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            for (int i = 0; i < configuration.wepKeys.length; i++) {
23936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                if (!TextUtils.isEmpty(configuration.wepKeys[i])) {
2394a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    assertEquals(WifiConfigManager.PASSWORD_MASK, configuration.wepKeys[i]);
23956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                }
23966e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            }
23976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
239822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (!TextUtils.isEmpty(configuration.enterpriseConfig.getPassword())) {
23996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            assertEquals(
2400a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    WifiConfigManager.PASSWORD_MASK,
24016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    configuration.enterpriseConfig.getPassword());
24026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
24036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
24066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the network was present in the network change broadcast and returns the
24076e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * change reason.
24086e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
24096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private int verifyNetworkInBroadcastAndReturnReason(WifiConfiguration configuration) {
24106e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
24116e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        ArgumentCaptor<UserHandle> userHandleCaptor = ArgumentCaptor.forClass(UserHandle.class);
24126e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        mContextConfigStoreMockOrder.verify(mContext)
24136e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                .sendBroadcastAsUser(intentCaptor.capture(), userHandleCaptor.capture());
24146e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24156e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(userHandleCaptor.getValue(), UserHandle.ALL);
24166e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        Intent intent = intentCaptor.getValue();
24176e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        int changeReason = intent.getIntExtra(WifiManager.EXTRA_CHANGE_REASON, -1);
24196e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        WifiConfiguration retrievedConfig =
24206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                (WifiConfiguration) intent.getExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
24216e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(retrievedConfig.configKey(), configuration.configKey());
24226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24236e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that all the passwords are masked in the broadcast configuration.
24246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedConfig);
24256e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return changeReason;
24276e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24286e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24296e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
24306e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out an add broadcast with the provided network.
24316e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
24326e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkAddBroadcast(WifiConfiguration configuration) {
24336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
24346e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
24356e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_ADDED);
24366e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24376e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
24396e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out an update broadcast with the provided network.
24406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
24416e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkUpdateBroadcast(WifiConfiguration configuration) {
24426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
24436e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
24446e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_CONFIG_CHANGE);
24456e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24466e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
24486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out a remove broadcast with the provided network.
24496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
24506e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkRemoveBroadcast(WifiConfiguration configuration) {
24516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
24526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
24536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_REMOVED);
24546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24566e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
245750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Adds the provided configuration to WifiConfigManager and modifies the provided configuration
245850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * with creator/update uid, package name and time. This also sets defaults for fields not
245950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * populated.
246050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * These fields are populated internally by WifiConfigManager and hence we need
246150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * to modify the configuration before we compare the added network with the retrieved network.
246250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
246350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration) {
246450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_CREATION_TIME_MILLIS);
246550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        NetworkUpdateResult result =
246650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(configuration, TEST_CREATOR_UID);
246750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setDefaults(configuration);
246850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setCreationDebugParams(configuration);
24696e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        configuration.networkId = result.getNetworkId();
24706e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
24716e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24726e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24736e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
24746e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Add network to WifiConfigManager and ensure that it was successful.
24756e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
24766e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyAddNetworkToWifiConfigManager(
24776e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
24786e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
24796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
24806e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.isNewNetwork());
24816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
24826e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
24836e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24846e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkAddBroadcast(configuration);
24856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that the config store write was triggered with this new configuration.
24866e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkInConfigStoreData(configuration);
24876e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
24886e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
24896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
24906e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
24916e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Add ephemeral network to WifiConfigManager and ensure that it was successful.
24926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
24936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyAddEphemeralNetworkToWifiConfigManager(
24946e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
24956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
24966e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
24976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.isNewNetwork());
24986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
24996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
25006e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
25016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkAddBroadcast(configuration);
25026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Ephemeral networks should not be persisted.
25036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkNotInConfigStoreData(configuration);
250450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        return result;
250550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
250650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
250750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
250850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Updates the provided configuration to WifiConfigManager and modifies the provided
250950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * configuration with update uid, package name and time.
251050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * These fields are populated internally by WifiConfigManager and hence we need
251150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * to modify the configuration before we compare the added network with the retrieved network.
251250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
251350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private NetworkUpdateResult updateNetworkToWifiConfigManager(WifiConfiguration configuration) {
251450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_UPDATE_TIME_MILLIS);
251550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        NetworkUpdateResult result =
251650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(configuration, TEST_UPDATE_UID);
251750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setUpdateDebugParams(configuration);
251850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        return result;
251950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
25206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
25216e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
25226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager config change and ensure that it was successful.
25236e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
25246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManager(
25256e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
25266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = updateNetworkToWifiConfigManager(configuration);
25276e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
25286e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.isNewNetwork());
25296e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
25306e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkUpdateBroadcast(configuration);
25316e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that the config store write was triggered with this new configuration.
25326e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkInConfigStoreData(configuration);
25336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
25346e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
25356e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
25366e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
25376e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager without IP config change and ensure that it was
25386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * successful.
25396e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
25406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(
25416e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
25426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManager(configuration);
25436e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.hasIpChanged());
25446e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.hasProxyChanged());
25456e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
25466e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
25476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
25486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
25496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager with IP config change and ensure that it was
25506e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * successful.
25516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
25526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManagerWithIpChange(
25536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
25546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManager(configuration);
25556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
25566e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
25576e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
25586e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
2559c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
2560c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
2561c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * Removes network from WifiConfigManager and ensure that it was successful.
2562c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
2563c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    private void verifyRemoveNetworkFromWifiConfigManager(
2564c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius            WifiConfiguration configuration) {
25656d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID));
2566c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
2567c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyNetworkRemoveBroadcast(configuration);
2568c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Verify if the config store write was triggered without this new configuration.
2569c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyNetworkNotInConfigStoreData(configuration);
2570c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
2571fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2572fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
2573fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the provided network's public status and ensures that the network change broadcast
2574fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * has been sent out.
2575fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
2576fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private void verifyUpdateNetworkStatus(WifiConfiguration configuration, int status) {
2577fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertEquals(status, configuration.status);
2578fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyNetworkUpdateBroadcast(configuration);
2579fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
2580fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2581fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
2582fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the network's selection status update.
2583fc789b2227e92372b2489ca54691310800835a50Roshan Pius     *
2584fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * For temporarily disabled reasons, the method ensures that the status has changed only if
2585fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * disable reason counter has exceeded the threshold.
2586fc789b2227e92372b2489ca54691310800835a50Roshan Pius     *
2587fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * For permanently disabled/enabled reasons, the method ensures that the public status has
2588fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * changed and the network change broadcast has been sent out.
2589fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
2590fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private void verifyUpdateNetworkSelectionStatus(
2591fc789b2227e92372b2489ca54691310800835a50Roshan Pius            int networkId, int reason, int temporaryDisableReasonCounter) {
2592fc789b2227e92372b2489ca54691310800835a50Roshan Pius        when(mClock.getElapsedSinceBootMillis())
2593fc789b2227e92372b2489ca54691310800835a50Roshan Pius                .thenReturn(TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS);
2594fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2595fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Fetch the current status of the network before we try to update the status.
2596fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
2597fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus currentStatus = retrievedNetwork.getNetworkSelectionStatus();
2598fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int currentDisableReason = currentStatus.getNetworkSelectionDisableReason();
2599fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2600fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set the status to the provided reason.
2601fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkSelectionStatus(networkId, reason));
2602fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2603fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now fetch the network configuration and verify the new status of the network.
2604fc789b2227e92372b2489ca54691310800835a50Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
2605fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2606fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
2607fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int retrievedDisableReason = retrievedStatus.getNetworkSelectionDisableReason();
2608fc789b2227e92372b2489ca54691310800835a50Roshan Pius        long retrievedDisableTime = retrievedStatus.getDisableTime();
2609fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int retrievedDisableReasonCounter = retrievedStatus.getDisableReasonCounter(reason);
2610fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int disableReasonThreshold =
2611a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[reason];
2612fc789b2227e92372b2489ca54691310800835a50Roshan Pius
2613fc789b2227e92372b2489ca54691310800835a50Roshan Pius        if (reason == NetworkSelectionStatus.NETWORK_SELECTION_ENABLE) {
2614fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(reason, retrievedDisableReason);
2615fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertTrue(retrievedStatus.isNetworkEnabled());
2616fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(
2617fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    NetworkSelectionStatus.INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP,
2618fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    retrievedDisableTime);
2619fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
2620fc789b2227e92372b2489ca54691310800835a50Roshan Pius        } else if (reason < NetworkSelectionStatus.DISABLED_TLS_VERSION_MISMATCH) {
2621fc789b2227e92372b2489ca54691310800835a50Roshan Pius            // For temporarily disabled networks, we need to ensure that the current status remains
2622fc789b2227e92372b2489ca54691310800835a50Roshan Pius            // until the threshold is crossed.
2623fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(temporaryDisableReasonCounter, retrievedDisableReasonCounter);
2624fc789b2227e92372b2489ca54691310800835a50Roshan Pius            if (retrievedDisableReasonCounter < disableReasonThreshold) {
2625fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(currentDisableReason, retrievedDisableReason);
2626fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(
2627fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        currentStatus.getNetworkSelectionStatus(),
2628fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        retrievedStatus.getNetworkSelectionStatus());
2629fc789b2227e92372b2489ca54691310800835a50Roshan Pius            } else {
2630fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(reason, retrievedDisableReason);
2631fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertTrue(retrievedStatus.isNetworkTemporaryDisabled());
2632fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(
2633fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS, retrievedDisableTime);
2634fc789b2227e92372b2489ca54691310800835a50Roshan Pius            }
2635fc789b2227e92372b2489ca54691310800835a50Roshan Pius        } else if (reason < NetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX) {
2636fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(reason, retrievedDisableReason);
2637fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertTrue(retrievedStatus.isNetworkPermanentlyDisabled());
2638fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(
2639fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    NetworkSelectionStatus.INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP,
2640fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    retrievedDisableTime);
2641fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.DISABLED);
2642fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
2643fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
2644fc789b2227e92372b2489ca54691310800835a50Roshan Pius
264522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
26462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Creates a scan detail corresponding to the provided network and given BSSID, level &frequency
26472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * values.
264822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
26492dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private ScanDetail createScanDetailForNetwork(
26502dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            WifiConfiguration configuration, String bssid, int level, int frequency) {
265122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        String caps;
265222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
265322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WPA2-PSK-CCMP]";
265422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)
265522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                || configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X)) {
265622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WPA2-EAP-CCMP]";
265722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)
265822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                && WifiConfigurationUtil.hasAnyValidWepKey(configuration.wepKeys)) {
265922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WEP]";
266022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else {
266122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[]";
266222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        }
266322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiSsid ssid = WifiSsid.createFromAsciiEncoded(configuration.getPrintableSsid());
266422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Fill in 0's in the fields we don't care about.
266522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        return new ScanDetail(
26662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                ssid, bssid, caps, level, frequency, mClock.getUptimeSinceBootMillis(),
26672dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mClock.getWallClockMillis());
26682dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
26692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
26702dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
26712dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Creates a scan detail corresponding to the provided network and BSSID value.
26722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
26732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration, String bssid) {
26742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        return createScanDetailForNetwork(configuration, bssid, 0, 0);
267522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
267622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
267722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
267822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Creates a scan detail corresponding to the provided network and fixed BSSID value.
267922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
268022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration) {
268122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        return createScanDetailForNetwork(configuration, TEST_BSSID);
268222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
268322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
268422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
268522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Adds the provided network and then creates a scan detail corresponding to the network. The
268622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * method then creates a ScanDetail corresponding to the network and ensures that the network
268722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * is properly matched using
2688a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)} and also
268922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * verifies that the provided scan detail was cached,
269022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
269122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    private void verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
269222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            WifiConfiguration network) {
269322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // First add the provided network.
269422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
269522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
269622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now create a dummy scan detail corresponding to the network.
269722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail scanDetail = createScanDetailForNetwork(network);
269822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanResult scanResult = scanDetail.getScanResult();
269922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
270022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration retrievedNetwork =
270122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail);
2702e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius        // Retrieve the network with password data for comparison.
2703e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius        retrievedNetwork =
2704e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(retrievedNetwork.networkId);
270522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
270622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
270722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                network, retrievedNetwork);
270822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
270922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now retrieve the scan detail cache and ensure that the new scan detail is in cache.
271022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetailCache retrievedScanDetailCache =
271122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                mWifiConfigManager.getScanDetailCacheForNetwork(network.networkId);
271222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertEquals(1, retrievedScanDetailCache.size());
271322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanResult retrievedScanResult = retrievedScanDetailCache.get(scanResult.BSSID);
271422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
271522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanTestUtil.assertScanResultEquals(scanResult, retrievedScanResult);
271622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
27172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
27182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
27192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Adds a new network and verifies that the |HasEverConnected| flag is set to false.
27202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
27212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyAddNetworkHasEverConnectedFalse(WifiConfiguration network) {
27222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network);
27232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
27242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
27252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse("Adding a new network should not have hasEverConnected set to true.",
27262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
27272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
27282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
27292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
27302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Updates an existing network with some credential change and verifies that the
27312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * |HasEverConnected| flag is set to false.
27322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
27332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(
27342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius            WifiConfiguration network) {
27352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
27362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
27372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
27382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse("Updating network credentials config should clear hasEverConnected.",
27392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
27402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
27412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
27422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
27432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Updates an existing network after connection using
2744a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkAfterConnect(int)} and asserts that the
27452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * |HasEverConnected| flag is set to true.
27462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
27472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyUpdateNetworkAfterConnectHasEverConnectedTrue(int networkId) {
27482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(networkId));
27492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
27502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue("hasEverConnected expected to be true after connection.",
27512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
27522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
27532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
2754c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2755c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Sets up a user profiles for WifiConfigManager testing.
2756c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     *
2757c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * @param userId Id of the user.
2758c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2759c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private void setupUserProfiles(int userId) {
2760c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final UserInfo userInfo =
2761c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                new UserInfo(userId, Integer.toString(userId), UserInfo.FLAG_PRIMARY);
2762c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<UserInfo> userProfiles = Arrays.asList(userInfo);
2763c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.getProfiles(userId)).thenReturn(userProfiles);
2764c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(userId)).thenReturn(true);
2765c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2766c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
276750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius}
2768