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
220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhneimport android.app.admin.DeviceAdminInfo;
230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhneimport android.app.admin.DevicePolicyManagerInternal;
2450eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.app.test.MockAnswerUtil.AnswerWithArguments;
2550eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.content.Context;
266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.content.Intent;
2765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Piusimport android.content.pm.ApplicationInfo;
2850eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.content.pm.PackageManager;
29c381d005c60603aadd30581ce675e979b3fec3feRoshan Piusimport android.content.pm.UserInfo;
3050eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.net.IpConfiguration;
3122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Piusimport android.net.wifi.ScanResult;
3250eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.net.wifi.WifiConfiguration;
33fc789b2227e92372b2489ca54691310800835a50Roshan Piusimport android.net.wifi.WifiConfiguration.NetworkSelectionStatus;
341fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Piusimport android.net.wifi.WifiEnterpriseConfig;
356e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.net.wifi.WifiManager;
36fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Piusimport android.net.wifi.WifiScanner;
3722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Piusimport android.net.wifi.WifiSsid;
383a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiuimport android.os.Process;
396e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.os.UserHandle;
4050eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.os.UserManager;
4196241bee619ff7073635f680a36869f61a11a225Roshan Piusimport android.telephony.TelephonyManager;
4250eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.test.suitebuilder.annotation.SmallTest;
436e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.text.TextUtils;
440a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiuimport android.util.Pair;
4550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Piusimport com.android.internal.R;
473a738a26918230b2469d917dbf14323234edd39bRoshan Piusimport com.android.server.wifi.WifiConfigStoreLegacy.WifiConfigStoreDataLegacy;
48835e781643b79c30fabbab5595770cf01b5861fbRebecca Silbersteinimport com.android.server.wifi.util.WifiPermissionsUtil;
490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhneimport com.android.server.wifi.util.WifiPermissionsWrapper;
508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
51ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Piusimport org.junit.After;
5250eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.junit.Before;
5350eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.junit.Test;
546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport org.mockito.ArgumentCaptor;
556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport org.mockito.InOrder;
5650eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.mockito.Mock;
5750eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.mockito.MockitoAnnotations;
5850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
5942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.FileDescriptor;
6042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.PrintWriter;
6142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.StringWriter;
6250eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport java.util.ArrayList;
631fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Piusimport java.util.Arrays;
642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Piusimport java.util.HashSet;
6550eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport java.util.List;
66f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silbersteinimport java.util.Random;
67674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Piusimport java.util.Set;
6850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
6950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius/**
70a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius * Unit tests for {@link com.android.server.wifi.WifiConfigManager}.
7150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius */
7250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius@SmallTest
73a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Piuspublic class WifiConfigManagerTest {
7450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
7550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final String TEST_BSSID = "0a:08:5c:67:89:00";
7650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final long TEST_WALLCLOCK_CREATION_TIME_MILLIS = 9845637;
7750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final long TEST_WALLCLOCK_UPDATE_TIME_MILLIS = 75455637;
78fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private static final long TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS = 29457631;
791fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee    private static final int TEST_CREATOR_UID = WifiConfigurationTestUtil.TEST_UID;
800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final int TEST_NO_PERM_UID = 7;
8150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final int TEST_UPDATE_UID = 4;
826d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    private static final int TEST_SYSUI_UID = 56;
836d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    private static final int TEST_DEFAULT_USER = UserHandle.USER_SYSTEM;
842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private static final int TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN = 5;
852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private static final Integer[] TEST_FREQ_LIST = {2400, 2450, 5150, 5175, 5650};
860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_CREATOR_NAME = "com.wificonfigmanager.creator";
870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_UPDATE_NAME = "com.wificonfigmanager.update";
880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_NO_PERM_NAME = "com.wificonfigmanager.noperm";
898600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    private static final String TEST_DEFAULT_GW_MAC_ADDRESS = "0f:67:ad:ef:09:34";
900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_HOST_1 = "192.168.48.1";
910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final int    TEST_STATIC_PROXY_PORT_1 = 8000;
920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_EXCLUSION_LIST_1 = "";
930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_PAC_PROXY_LOCATION_1 = "http://bleh";
940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_HOST_2 = "192.168.1.1";
950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final int    TEST_STATIC_PROXY_PORT_2 = 3000;
960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_EXCLUSION_LIST_2 = "";
970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_PAC_PROXY_LOCATION_2 = "http://blah";
9850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
9950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private Context mContext;
10050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private Clock mClock;
10150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private UserManager mUserManager;
10296241bee619ff7073635f680a36869f61a11a225Roshan Pius    @Mock private TelephonyManager mTelephonyManager;
10350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private WifiKeyStore mWifiKeyStore;
104a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius    @Mock private WifiConfigStore mWifiConfigStore;
1053a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Mock private WifiConfigStoreLegacy mWifiConfigStoreLegacy;
10650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private PackageManager mPackageManager;
1070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Mock private DevicePolicyManagerInternal mDevicePolicyManagerInternal;
108835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein    @Mock private WifiPermissionsUtil mWifiPermissionsUtil;
1090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Mock private WifiPermissionsWrapper mWifiPermissionsWrapper;
1100a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    @Mock private NetworkListStoreData mNetworkListStoreData;
1110a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    @Mock private DeletedEphemeralSsidsStoreData mDeletedEphemeralSsidsStoreData;
1125d0addadb370bcbb8900414fb9597bd415e6fea0Randy Pan    @Mock private WifiConfigManager.OnSavedNetworkUpdateListener mWcmListener;
11350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private MockResources mResources;
1156e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private InOrder mContextConfigStoreMockOrder;
1160a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    private InOrder mNetworkListStoreDataMockOrder;
117a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius    private WifiConfigManager mWifiConfigManager;
118dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    private boolean mStoreReadTriggered = false;
11950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
12050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
121a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Setup the mocks and an instance of WifiConfigManager before each test.
12250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
12350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Before
12450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void setUp() throws Exception {
12550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        MockitoAnnotations.initMocks(this);
12650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1276e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Set up the inorder for verifications. This is needed to verify that the broadcasts,
1286e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // store writes for network updates followed by network additions are in the expected order.
1296e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        mContextConfigStoreMockOrder = inOrder(mContext, mWifiConfigStore);
1300a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mNetworkListStoreDataMockOrder = inOrder(mNetworkListStoreData);
1316e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
13250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Set up the package name stuff & permission override.
13350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mContext.getPackageManager()).thenReturn(mPackageManager);
1342dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources = new MockResources();
1352dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setBoolean(
1368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                R.bool.config_wifi_only_link_same_credential_configurations, true);
1372dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
1382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
1392dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN);
1402dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        when(mContext.getResources()).thenReturn(mResources);
1418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
1426d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Setup UserManager profiles for the default user.
1436d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(TEST_DEFAULT_USER);
1446d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
14550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
14650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public String answer(int uid) throws Exception {
14750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                if (uid == TEST_CREATOR_UID) {
14850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return TEST_CREATOR_NAME;
14950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                } else if (uid == TEST_UPDATE_UID) {
15050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return TEST_UPDATE_NAME;
1516d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                } else if (uid == TEST_SYSUI_UID) {
152a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    return WifiConfigManager.SYSUI_PACKAGE_NAME;
1530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                } else if (uid == TEST_NO_PERM_UID) {
1540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                    return TEST_NO_PERM_NAME;
15550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
15650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                fail("Unexpected UID: " + uid);
15750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return "";
15850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
15950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mPackageManager).getNameForUid(anyInt());
1606d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        doAnswer(new AnswerWithArguments() {
1616d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius            public int answer(String packageName, int flags, int userId) throws Exception {
162a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                if (packageName.equals(WifiConfigManager.SYSUI_PACKAGE_NAME)) {
1636d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                    return TEST_SYSUI_UID;
1646d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                } else {
1656d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                    return 0;
1666d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                }
1676d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius            }
1686d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        }).when(mPackageManager).getPackageUidAsUser(anyString(), anyInt(), anyInt());
16950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1701fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        when(mWifiKeyStore
17128102ffacda0802a1c4aa1b7edbbcc2bf01391a9Roshan Pius                .updateNetworkKeys(any(WifiConfiguration.class), any()))
1721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                .thenReturn(true);
1731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
1743a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(true);
175dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        setupStoreDataForRead(new ArrayList<WifiConfiguration>(),
176dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius                new ArrayList<WifiConfiguration>(), new HashSet<String>());
1773a738a26918230b2469d917dbf14323234edd39bRoshan Pius
1780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(), anyInt()))
1790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(false);
180835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein        when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(true);
1810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mWifiPermissionsWrapper.getDevicePolicyManagerInternal())
1820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(mDevicePolicyManagerInternal);
1832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
1845d0addadb370bcbb8900414fb9597bd415e6fea0Randy Pan        mWifiConfigManager.setOnSavedNetworkUpdateListener(mWcmListener);
18550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
18650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
18750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
188ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius     * Called after each test
189ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius     */
190ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    @After
191ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    public void cleanup() {
192ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius        validateMockitoUsage();
193ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    }
194ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius
195ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    /**
19623ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius     * Verifies that network retrieval via
19723ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius     * {@link WifiConfigManager#getConfiguredNetworks()} and
19823ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius     * {@link WifiConfigManager#getConfiguredNetworksWithPasswords()} works even if we have not
19923ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius     * yet loaded data from store.
20023ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius     */
20123ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius    @Test
20223ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius    public void testGetConfiguredNetworksBeforeLoadFromStore() {
20323ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
20423ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworksWithPasswords().isEmpty());
20523ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius    }
20623ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius
20723ed63d91b8af8f1d3569371daedc4162e323cc0Roshan Pius    /**
208dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     * Verifies that network addition via
209dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} fails if we have not
210dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     * yet loaded data from store.
211dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     */
212dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    @Test
213dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    public void testAddNetworkBeforeLoadFromStore() {
214dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
215dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        assertFalse(
216dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius                mWifiConfigManager.addOrUpdateNetwork(openNetwork, TEST_CREATOR_UID).isSuccess());
217dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    }
218dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius
219dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    /**
22050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single network using
221a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
22250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
22350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
22450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleOpenNetwork() {
22550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
22650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
22750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
22850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2296e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
23050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
23150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
23250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
23350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
23450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
2350ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        // Ensure that the newly added network is disabled.
2360ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        assertEquals(WifiConfiguration.Status.DISABLED, retrievedNetworks.get(0).status);
23750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
23850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
23950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
24050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the modification of a single network using
241a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
24250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
24350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
24450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetwork() {
24550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
24650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
24750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
24850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
250403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener).onSavedNetworkAdded(openNetwork.networkId);
251403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        reset(mWcmListener);
25250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID for the network.
25450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
2556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
25650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
25750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that the modification has been effective.
25850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
25950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
26050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
26150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
262403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener).onSavedNetworkUpdated(openNetwork.networkId);
26350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
26450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
26550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
26650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single ephemeral network using
267a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
268a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * the {@link WifiConfigManager#getSavedNetworks()} does not return this network.
26950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
27050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
271bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    public void testAddSingleEphemeralNetwork() throws Exception {
272bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
273bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        ephemeralNetwork.ephemeral = true;
27450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
275bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        networks.add(ephemeralNetwork);
27650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
277bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyAddEphemeralNetworkToWifiConfigManager(ephemeralNetwork);
27850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
27950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
28050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
28150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
28250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
28350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
28450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Ensure that this is not returned in the saved network list.
28550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(mWifiConfigManager.getSavedNetworks().isEmpty());
286403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener, never()).onSavedNetworkAdded(ephemeralNetwork.networkId);
28750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
28850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
28950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
290bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Verifies the addition of 2 networks (1 normal and 1 ephemeral) using
291bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and ensures that
292bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * the ephemeral network configuration is not persisted in config store.
293bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
294bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    @Test
295bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    public void testAddMultipleNetworksAndEnsureEphemeralNetworkNotPersisted() {
296bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
297bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        ephemeralNetwork.ephemeral = true;
298bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
299bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
300bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(addNetworkToWifiConfigManager(ephemeralNetwork).isSuccess());
301bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(addNetworkToWifiConfigManager(openNetwork).isSuccess());
302bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
303bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // The open network addition should trigger a store write.
3040a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        Pair<List<WifiConfiguration>, List<WifiConfiguration>> networkListStoreData =
3050a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                captureWriteNetworksListStoreData();
3060a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        List<WifiConfiguration> networkList = new ArrayList<>();
3070a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        networkList.addAll(networkListStoreData.first);
3080a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        networkList.addAll(networkListStoreData.second);
3090a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        assertFalse(isNetworkInConfigStoreData(ephemeralNetwork, networkList));
3100a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        assertTrue(isNetworkInConfigStoreData(openNetwork, networkList));
311bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
312bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
313bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
31450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies that the modification of a single open network using
315a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with a UID which
31650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * has no permission to modify the network fails.
31750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
31850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
31950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetworkFailedDueToPermissionDenied() throws Exception {
32050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
32150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
32250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
32350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
32550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
32750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
32850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
329835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein        when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(false);
33050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
33150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration and ensure that the operation failed.
3326e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = updateNetworkToWifiConfigManager(openNetwork);
33350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(result.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
33450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
33550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
33650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
33750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies that the modification of a single open network using
338a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with the creator UID
33950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * should always succeed.
34050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
34150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
34250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetworkSuccessWithCreatorUID() throws Exception {
34350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
34450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
34550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
34650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
34850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
35050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
35150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
35250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration using the creator UID.
3536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result =
3546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(openNetwork, TEST_CREATOR_UID);
35550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
35650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
35750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that the modification has been effective.
35850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
35950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
36050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
36150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
36250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
36350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
36450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
36550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single PSK network using
366a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
367a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworks()} masks the password.
36850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
36950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
37050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSinglePskNetwork() {
37150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
37250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
37350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(pskNetwork);
37450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3756e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
37650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
37750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
37850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
37950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
38050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
38150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
38250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedSavedNetworks = mWifiConfigManager.getSavedNetworks();
38350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.size(), 1);
38450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.get(0).configKey(), pskNetwork.configKey());
3856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedSavedNetworks.get(0));
38650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
38750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
38850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
38950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single WEP network using
390a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
391a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworks()} masks the password.
39250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
39350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
39450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleWepNetwork() {
39550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
39650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
39750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(wepNetwork);
39850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
40050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
40150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
40250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
40350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
40450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
40550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
40650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedSavedNetworks = mWifiConfigManager.getSavedNetworks();
40750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.size(), 1);
40850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.get(0).configKey(), wepNetwork.configKey());
4096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedSavedNetworks.get(0));
41050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
41150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
41250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
41350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the modification of an IpConfiguration using
414a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
41550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
41650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
41750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateIpConfiguration() {
41850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
41950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
42050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
42150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
4226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
42350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
4246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
42550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
42650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
42750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration and ensure that the IP configuration change flags
42850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // are not set.
4296e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
43050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
4310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Configure mock DevicePolicyManager to give Profile Owner permission so that we can modify
4320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // proxy settings on a configuration
4330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
4340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_PROFILE_OWNER))).thenReturn(true);
4350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
43650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Change the IpConfiguration now and ensure that the IP configuration flags are set now.
43750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkIpConfiguration(
43850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                openNetwork,
43950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                WifiConfigurationTestUtil.createStaticIpConfigurationWithStaticProxy());
4406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithIpChange(openNetwork);
44150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
44250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that all the modifications have been effective.
44350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
44450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
44550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
44650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
44750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
44850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
44950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
450c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * Verifies the removal of a single network using
451a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
452c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
453c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    @Test
454c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    public void testRemoveSingleOpenNetwork() {
455c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
456c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
457c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
458403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener).onSavedNetworkAdded(openNetwork.networkId);
459403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        reset(mWcmListener);
460403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang
461bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that configured network list is not empty.
462bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
463c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
464c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(openNetwork);
465bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that configured network list is empty now.
466bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
467403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener).onSavedNetworkRemoved(openNetwork.networkId);
468bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
469bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
470bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
471bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Verifies the removal of an ephemeral network using
472bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
473bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
474bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    @Test
475bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    public void testRemoveSingleEphemeralNetwork() throws Exception {
476bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
477bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        ephemeralNetwork.ephemeral = true;
478bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
479bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyAddEphemeralNetworkToWifiConfigManager(ephemeralNetwork);
480bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that configured network list is not empty.
481bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
482403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener, never()).onSavedNetworkAdded(ephemeralNetwork.networkId);
483c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
484bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyRemoveEphemeralNetworkFromWifiConfigManager(ephemeralNetwork);
485c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Ensure that configured network list is empty now.
486c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
487403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener, never()).onSavedNetworkRemoved(ephemeralNetwork.networkId);
488c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
489c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
490c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
491d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     * Verifies the removal of a Passpoint network using
492d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     * {@link WifiConfigManager#removeNetwork(int)}
493d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     */
494d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    @Test
495d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    public void testRemoveSinglePasspointNetwork() throws Exception {
496d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        WifiConfiguration passpointNetwork = WifiConfigurationTestUtil.createPasspointNetwork();
497d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
498d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        verifyAddPasspointNetworkToWifiConfigManager(passpointNetwork);
499d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        // Ensure that configured network list is not empty.
500d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
501403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener, never()).onSavedNetworkAdded(passpointNetwork.networkId);
502d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
503d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        verifyRemovePasspointNetworkFromWifiConfigManager(passpointNetwork);
504d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        // Ensure that configured network list is empty now.
505d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
506403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener, never()).onSavedNetworkRemoved(passpointNetwork.networkId);
507d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    }
508d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
509d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    /**
5103a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu     * Verify that a Passpoint network that's added by an app with {@link #TEST_CREATOR_UID} can
5113a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu     * be removed by WiFi Service with {@link Process#WIFI_UID}.
5123a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu     *
5133a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu     * @throws Exception
5143a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu     */
5153a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu    @Test
5163a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu    public void testRemovePasspointNetworkAddedByOther() throws Exception {
5173a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        WifiConfiguration passpointNetwork = WifiConfigurationTestUtil.createPasspointNetwork();
5183a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu
5193a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        // Passpoint network is added using TEST_CREATOR_UID.
5203a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        verifyAddPasspointNetworkToWifiConfigManager(passpointNetwork);
5213a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        // Ensure that configured network list is not empty.
5223a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
5233a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu
5243a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        assertTrue(mWifiConfigManager.removeNetwork(passpointNetwork.networkId, Process.WIFI_UID));
5253a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu
5263a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        // Verify keys are not being removed.
5273a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class));
5283a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        verifyNetworkRemoveBroadcast(passpointNetwork);
5293a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        // Ensure that the write was not invoked for Passpoint network remove.
5303a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
5313a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu
5323a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu    }
5333a86cc60b6cd3a5eb7b4982ba98f7e71ad45915ePeter Qiu    /**
534fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the addition & update of multiple networks using
535a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and the
536c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * removal of networks using
537a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
538c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
539c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    @Test
540fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testAddUpdateRemoveMultipleNetworks() {
541c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
542c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
543c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
544c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
545c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(openNetwork);
546c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(pskNetwork);
547c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(wepNetwork);
548c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
549c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
550c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
551c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
552c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
553c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now verify that all the additions has been effective.
554c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> retrievedNetworks =
555c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
556c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
557c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                networks, retrievedNetworks);
558c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
559c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Modify all the 3 configurations and update it to WifiConfigManager.
560c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
561c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkBSSID(pskNetwork, TEST_BSSID);
562c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkIpConfiguration(
563c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                wepNetwork,
564c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                WifiConfigurationTestUtil.createStaticIpConfigurationWithPacProxy());
565c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
5660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Configure mock DevicePolicyManager to give Profile Owner permission so that we can modify
5670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // proxy settings on a configuration
5680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
5690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_PROFILE_OWNER))).thenReturn(true);
5700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
571c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
572c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(pskNetwork);
573c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithIpChange(wepNetwork);
574c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now verify that all the modifications has been effective.
575c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
576c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
577c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                networks, retrievedNetworks);
578c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
579c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now remove all 3 networks.
580c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(openNetwork);
581c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(pskNetwork);
582c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(wepNetwork);
583c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
584c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Ensure that configured network list is empty now.
585c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
586c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
587c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
588c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
589fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the update of network status using
590a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)}.
591fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
592fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
593fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testNetworkSelectionStatus() {
594fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
595fc789b2227e92372b2489ca54691310800835a50Roshan Pius
596fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
597fc789b2227e92372b2489ca54691310800835a50Roshan Pius
598403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        int networkId = result.getNetworkId();
599fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
600fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
601403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang                networkId, NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
602fc789b2227e92372b2489ca54691310800835a50Roshan Pius
603fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled. The threshold for association rejection is 5, so
604fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // disable it 5 times to actually mark it temporarily disabled.
605fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
606fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectThreshold =
607a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
608fc789b2227e92372b2489ca54691310800835a50Roshan Pius        for (int i = 1; i <= assocRejectThreshold; i++) {
609fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkSelectionStatus(result.getNetworkId(), assocRejectReason, i);
610fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
611403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener).onSavedNetworkTemporarilyDisabled(networkId);
612fc789b2227e92372b2489ca54691310800835a50Roshan Pius
613fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to permanently disabled.
614fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
615fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER, 0);
616403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener).onSavedNetworkPermanentlyDisabled(networkId);
617fc789b2227e92372b2489ca54691310800835a50Roshan Pius
618fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it back to enabled.
619fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
620fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
621403df479e25031276c738dbea334f09bb7e4bf37Ningyuan Wang        verify(mWcmListener, times(2)).onSavedNetworkEnabled(networkId);
622fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
623fc789b2227e92372b2489ca54691310800835a50Roshan Pius
624fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
625fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the update of network status using
626a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and ensures that
627fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * enabling a network clears out all the temporary disable counters.
628fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
629fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
630fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testNetworkSelectionStatusEnableClearsDisableCounters() {
631fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
632fc789b2227e92372b2489ca54691310800835a50Roshan Pius
633fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
634fc789b2227e92372b2489ca54691310800835a50Roshan Pius
635fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
636fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
637fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
638fc789b2227e92372b2489ca54691310800835a50Roshan Pius
639fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled 2 times for 2 different reasons.
640fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
641fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 1);
642fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
643fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 2);
644fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
645fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 1);
646fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
647fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 2);
648fc789b2227e92372b2489ca54691310800835a50Roshan Pius
649fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it back to enabled.
650fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
651fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
652fc789b2227e92372b2489ca54691310800835a50Roshan Pius
653fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Ensure that the counters have all been reset now.
654fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
655fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 1);
656fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
657fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 1);
658fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
659fc789b2227e92372b2489ca54691310800835a50Roshan Pius
660fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
6613f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh     * Verifies that {@link WifiConfigManager#updateNetworkNotRecommended(int, boolean)} correctly
6623f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh     * updates the {@link NetworkSelectionStatus#mNotRecommended} bit.
6633f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh     */
6643f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh    @Test
6653f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh    public void testUpdateNetworkNotRecommended() {
6663f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
6673f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6683f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
6693f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6703f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        // First retrieve the configuration and check this it does not have this bit set
6713f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.netId);
6723f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6733f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        assertFalse(retrievedNetwork.getNetworkSelectionStatus().isNotRecommended());
6743f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6753f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        // Update the network to be not recommended;
6763f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        assertTrue(mWifiConfigManager.updateNetworkNotRecommended(
6773f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh                result.netId, true /* notRecommended*/));
6783f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6793f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.netId);
6803f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6813f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        assertTrue(retrievedNetwork.getNetworkSelectionStatus().isNotRecommended());
6823f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6833f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        // Update the network to no longer be not recommended
6843f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        assertTrue(mWifiConfigManager.updateNetworkNotRecommended(
6853f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh                result.netId, false/* notRecommended*/));
6863f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6873f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.netId);
6883f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6893f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh        assertFalse(retrievedNetwork.getNetworkSelectionStatus().isNotRecommended());
6903f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh    }
6913f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh
6923f7cd32878130323e2632bc2c6b8b211f6260138Amin Shaikh    /**
693fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the enabling of temporarily disabled network using
694a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#tryEnableNetwork(int)}.
695fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
696fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
697fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testTryEnableNetwork() {
698fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
699fc789b2227e92372b2489ca54691310800835a50Roshan Pius
700fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
701fc789b2227e92372b2489ca54691310800835a50Roshan Pius
702fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
703fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
704fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
705fc789b2227e92372b2489ca54691310800835a50Roshan Pius
706fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled. The threshold for association rejection is 5, so
707fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // disable it 5 times to actually mark it temporarily disabled.
708fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
709fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectThreshold =
710a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
711fc789b2227e92372b2489ca54691310800835a50Roshan Pius        for (int i = 1; i <= assocRejectThreshold; i++) {
712fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkSelectionStatus(result.getNetworkId(), assocRejectReason, i);
713fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
714fc789b2227e92372b2489ca54691310800835a50Roshan Pius
715fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now let's try enabling this network without changing the time, this should fail and the
716fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // status remains temporarily disabled.
717fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertFalse(mWifiConfigManager.tryEnableNetwork(result.getNetworkId()));
718fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus retrievedStatus =
719fc789b2227e92372b2489ca54691310800835a50Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
720fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        .getNetworkSelectionStatus();
721fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(retrievedStatus.isNetworkTemporaryDisabled());
722fc789b2227e92372b2489ca54691310800835a50Roshan Pius
723fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now advance time by the timeout for association rejection and ensure that the network
724fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // is now enabled.
725fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectTimeout =
726a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_TIMEOUT_MS[assocRejectReason];
727fc789b2227e92372b2489ca54691310800835a50Roshan Pius        when(mClock.getElapsedSinceBootMillis())
728fc789b2227e92372b2489ca54691310800835a50Roshan Pius                .thenReturn(TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS + assocRejectTimeout);
729fc789b2227e92372b2489ca54691310800835a50Roshan Pius
730fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(mWifiConfigManager.tryEnableNetwork(result.getNetworkId()));
731fc789b2227e92372b2489ca54691310800835a50Roshan Pius        retrievedStatus =
732fc789b2227e92372b2489ca54691310800835a50Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
733fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        .getNetworkSelectionStatus();
734fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
735fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
736fc789b2227e92372b2489ca54691310800835a50Roshan Pius
737fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
738a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the enabling of network using
739a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} and
740a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#disableNetwork(int, int)}.
741a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
742a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
7436f1055408a43428ababffc1d1fa928c825924680Roshan Pius    public void testEnableDisableNetwork() throws Exception {
744a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
745a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
746a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
747a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
748a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
749a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), false, TEST_CREATOR_UID));
750a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
751a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
752a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
753a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
754a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
7556f1055408a43428ababffc1d1fa928c825924680Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(eq(true));
756a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
757a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now set it disabled.
758a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_CREATOR_UID));
759a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
760a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
761a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkPermanentlyDisabled());
762a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.DISABLED);
7636f1055408a43428ababffc1d1fa928c825924680Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(eq(true));
764a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
765a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
766a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
767a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the enabling of network using
768a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} with a UID which
769a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * has no permission to modify the network fails..
770a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
771a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
772a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testEnableDisableNetworkFailedDueToPermissionDenied() throws Exception {
773a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
774a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
775a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
776a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
777a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
778a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), false, TEST_CREATOR_UID));
779a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
780a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
781a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
782a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
783a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
784a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
785835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein        when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(false);
786a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
787a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now try to set it disabled with |TEST_UPDATE_UID|, it should fail and the network
788a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // should remain enabled.
789a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_UPDATE_UID));
790a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedStatus =
791a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
792a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                        .getNetworkSelectionStatus();
793a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
794a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(WifiConfiguration.Status.ENABLED, retrievedNetwork.status);
795a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
796a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
797a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
798a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the updation of network's connectUid using
799a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#checkAndUpdateLastConnectUid(int, int)}.
800a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
801a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
802a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testUpdateLastConnectUid() throws Exception {
803a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
804a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
805a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
806a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
807a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(
8082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.checkAndUpdateLastConnectUid(
8092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                        result.getNetworkId(), TEST_CREATOR_UID));
810a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
811a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
812a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(TEST_CREATOR_UID, retrievedNetwork.lastConnectUid);
813a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
814835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein        when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt())).thenReturn(false);
815a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
816a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now try to update the last connect UID with |TEST_UPDATE_UID|, it should fail and
817a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // the lastConnectUid should remain the same.
818a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(
8191fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                mWifiConfigManager.checkAndUpdateLastConnectUid(
8201fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                        result.getNetworkId(), TEST_UPDATE_UID));
821a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
822a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(TEST_CREATOR_UID, retrievedNetwork.lastConnectUid);
823a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
824a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
825a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
826a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration update attempt with an null config is gracefully
827a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
828a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
829a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
830a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
831a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testAddOrUpdateNetworkWithNullConfig() {
832a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(null, TEST_CREATOR_UID);
833a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(result.isSuccess());
834a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
835a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
836a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
837f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein     * Verifies that attempting to remove a network without any configs stored will return false.
838f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein     * This tests the case where we have not loaded any configs, potentially due to a pending store
839f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein     * read.
840f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein     * This invokes {@link WifiConfigManager#removeNetwork(int)}.
841f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein     */
842f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein    @Test
843f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein    public void testRemoveNetworkWithEmptyConfigStore() {
844f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein        int networkId = new Random().nextInt();
845f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein        assertFalse(mWifiConfigManager.removeNetwork(networkId, TEST_CREATOR_UID));
846f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein    }
847f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein
848f9c69201a95062e33cf62d7bacd465e799788a8fRebecca Silberstein    /**
849a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration removal attempt with an invalid networkID is gracefully
850a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
851a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#removeNetwork(int)}.
852a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
853a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
854a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testRemoveNetworkWithInvalidNetworkId() {
855a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
856a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
857a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
858a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
859a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Change the networkID to an invalid one.
860a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        openNetwork.networkId++;
8616d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertFalse(mWifiConfigManager.removeNetwork(openNetwork.networkId, TEST_CREATOR_UID));
862a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
863a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
864a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
865a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration update attempt with an invalid networkID is gracefully
866a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
867a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#enableNetwork(int, boolean, int)},
868a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#disableNetwork(int, int)},
869a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and
870a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#checkAndUpdateLastConnectUid(int, int)}.
871a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
872a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
873a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testChangeConfigurationWithInvalidNetworkId() {
874a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
875a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
876a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
877a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
878a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertFalse(mWifiConfigManager.enableNetwork(
879a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId() + 1, false, TEST_CREATOR_UID));
88022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertFalse(mWifiConfigManager.disableNetwork(result.getNetworkId() + 1, TEST_CREATOR_UID));
881a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.updateNetworkSelectionStatus(
88222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                result.getNetworkId() + 1, NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER));
883a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.checkAndUpdateLastConnectUid(
88422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                result.getNetworkId() + 1, TEST_CREATOR_UID));
885a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
886a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
887a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
8881fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies multiple modification of a single network using
889a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
8901fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * This test is basically checking if the apps can reset some of the fields of the config after
8911fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * addition. The fields being reset in this test are the |preSharedKey| and |wepKeys|.
8921fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 1. Create an open network initially.
8931fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 2. Modify the added network config to a WEP network config with all the 4 keys set.
8941fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 3. Modify the added network config to a WEP network config with only 1 key set.
8951fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 4. Modify the added network config to a PSK network config.
8961fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
8971fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
8981fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testMultipleUpdatesSingleNetwork() {
8991fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createOpenNetwork();
9001fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
9011fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9021fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now add |wepKeys| to the network. We don't need to update the |allowedKeyManagement|
9031fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // fields for open to WEP conversion.
9041fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        String[] wepKeys =
9051fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                Arrays.copyOf(WifiConfigurationTestUtil.TEST_WEP_KEYS,
9061fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                        WifiConfigurationTestUtil.TEST_WEP_KEYS.length);
9071fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        int wepTxKeyIdx = WifiConfigurationTestUtil.TEST_WEP_TX_KEY_INDEX;
9081fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
9091fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9101fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
9111fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9121fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
9131fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9141fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now empty out 3 of the |wepKeys[]| and ensure that those keys have been reset correctly.
9151fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        for (int i = 1; i < network.wepKeys.length; i++) {
9161fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            wepKeys[i] = "";
9171fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        }
9181fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepTxKeyIdx = 0;
9191fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
9201fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9211fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
9221fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9231fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
9241fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9251fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now change the config to a PSK network config by resetting the remaining |wepKey[0]|
9261fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // field and setting the |preSharedKey| and |allowedKeyManagement| fields.
9271fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepKeys[0] = "";
9281fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepTxKeyIdx = -1;
9291fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
9301fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
9311fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkPreSharedKey(network, WifiConfigurationTestUtil.TEST_PSK);
9321fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9331fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
9341fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9351fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
9361fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
9371fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9381fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
9391fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies the modification of a WifiEnteriseConfig using
940a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
9411fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
9421fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
9431fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testUpdateWifiEnterpriseConfig() {
9441fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
9451fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
9461fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9471fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Set the |password| field in WifiEnterpriseConfig and modify the config to PEAP/GTC.
9481fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig =
9491fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
9501fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkEnterprisePassword(network, "test");
9511fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9521fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
9531fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9541fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
9551fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9561fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Reset the |password| field in WifiEnterpriseConfig and modify the config to TLS/None.
9571fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
9581fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
9591fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkEnterprisePassword(network, "");
9601fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9611fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
9621fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9631fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
9641fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
9651fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9661fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
9671fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies the modification of a single network using
968a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} by passing in nulls
9691fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * in all the publicly exposed fields.
9701fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
9711fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
9721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testUpdateSingleNetworkWithNullValues() {
9731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
9741fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
9751fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9761fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Save a copy of the original network for comparison.
9771fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration originalNetwork = new WifiConfiguration(network);
9781fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9791fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now set all the public fields to null and try updating the network.
9809cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedAuthAlgorithms.clear();
9819cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedProtocols.clear();
9829cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedKeyManagement.clear();
9839cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedPairwiseCiphers.clear();
9849cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedGroupCiphers.clear();
9851fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.setIpConfiguration(null);
9861fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig = null;
9871fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9889cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        // Update the network.
9899cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        NetworkUpdateResult result = updateNetworkToWifiConfigManager(network);
9909cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
9919cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertFalse(result.isNewNetwork());
9929cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu
9939cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        // Verify no changes to the original network configuration.
9949cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        verifyNetworkUpdateBroadcast(originalNetwork);
9959cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        verifyNetworkInConfigStoreData(originalNetwork);
9969cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertFalse(result.hasIpChanged());
9979cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertFalse(result.hasProxyChanged());
9981fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9991fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Copy over the updated debug params to the original network config before comparison.
10001fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.lastUpdateUid = network.lastUpdateUid;
10011fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.lastUpdateName = network.lastUpdateName;
10021fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.updateTime = network.updateTime;
10031fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
10041fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now verify that there was no change to the network configurations.
10051fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
10061fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                originalNetwork,
10071fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(originalNetwork.networkId));
10081fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
10091fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
10101fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
10111230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     * Verifies that the modification of a single network using
1012a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} does not modify
10131230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     * existing configuration if there is a failure.
10141230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     */
10151230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    @Test
10161230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    public void testUpdateSingleNetworkFailureDoesNotModifyOriginal() {
10171230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
10181230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        network.enterpriseConfig =
10191230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
10201230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
10211230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
10221230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Save a copy of the original network for comparison.
10231230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfiguration originalNetwork = new WifiConfiguration(network);
10241230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
10251230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Now modify the network's EAP method.
10261230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        network.enterpriseConfig =
10271230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                WifiConfigurationTestUtil.createTLSWifiEnterpriseConfigWithNonePhase2();
10281230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
10291230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Fail this update because of cert installation failure.
10301230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        when(mWifiKeyStore
10311230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                .updateNetworkKeys(any(WifiConfiguration.class), any(WifiConfiguration.class)))
10321230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                .thenReturn(false);
10331230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        NetworkUpdateResult result =
10341230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(network, TEST_UPDATE_UID);
10351230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        assertTrue(result.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
10361230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
10371230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Now verify that there was no change to the network configurations.
10381230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
10391230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                originalNetwork,
10401230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(originalNetwork.networkId));
10411230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    }
10421230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
10431230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    /**
104422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies the matching of networks with different encryption types with the
104522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * corresponding scan detail using
1046a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)}.
104722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * The test also verifies that the provided scan detail was cached,
104822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
104922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
105022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testMatchScanDetailToNetworksAndCache() {
105122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Create networks of different types and ensure that they're all matched using
105222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // the corresponding ScanDetail correctly.
105322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
105422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createOpenNetwork());
105522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
105622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createWepNetwork());
105722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
105822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createPskNetwork());
105922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
106022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createEapNetwork());
106122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
106222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
106322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
106422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies that scan details with wrong SSID/authentication types are not matched using
1065a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)}
106622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * to the added networks.
106722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
106822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
106922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testNoMatchScanDetailToNetwork() {
107022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // First create networks of different types.
107122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
107222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
107322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
107422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
107522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
107622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now add them to WifiConfigManager.
107722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
107822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
107922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
108022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(eapNetwork);
108122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
108222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now create dummy scan detail corresponding to the networks.
108322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail openNetworkScanDetail = createScanDetailForNetwork(openNetwork);
108422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail wepNetworkScanDetail = createScanDetailForNetwork(wepNetwork);
108522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail pskNetworkScanDetail = createScanDetailForNetwork(pskNetwork);
108622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail eapNetworkScanDetail = createScanDetailForNetwork(eapNetwork);
108722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
108822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now mix and match parameters from different scan details.
108922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        openNetworkScanDetail.getScanResult().SSID =
109022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                wepNetworkScanDetail.getScanResult().SSID;
109122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        wepNetworkScanDetail.getScanResult().capabilities =
109222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                pskNetworkScanDetail.getScanResult().capabilities;
109322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        pskNetworkScanDetail.getScanResult().capabilities =
109422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                eapNetworkScanDetail.getScanResult().capabilities;
109522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        eapNetworkScanDetail.getScanResult().capabilities =
109622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                openNetworkScanDetail.getScanResult().capabilities;
109722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
109822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Try to lookup a saved network using the modified scan details. All of these should fail.
109922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(openNetworkScanDetail));
110022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(wepNetworkScanDetail));
110122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(pskNetworkScanDetail));
110222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eapNetworkScanDetail));
110322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
110422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // All the cache's should be empty as well.
110522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId));
110622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(wepNetwork.networkId));
110722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(pskNetwork.networkId));
110822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(eapNetwork.networkId));
110922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
111022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
111122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
1112850116348dacd6baf16645641c3383970e4a1157Peter Qiu     * Verifies that ScanDetail added for a network is cached correctly.
1113850116348dacd6baf16645641c3383970e4a1157Peter Qiu     */
1114850116348dacd6baf16645641c3383970e4a1157Peter Qiu    @Test
1115850116348dacd6baf16645641c3383970e4a1157Peter Qiu    public void testUpdateScanDetailForNetwork() {
1116850116348dacd6baf16645641c3383970e4a1157Peter Qiu        // First add the provided network.
1117850116348dacd6baf16645641c3383970e4a1157Peter Qiu        WifiConfiguration testNetwork = WifiConfigurationTestUtil.createOpenNetwork();
1118850116348dacd6baf16645641c3383970e4a1157Peter Qiu        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(testNetwork);
1119850116348dacd6baf16645641c3383970e4a1157Peter Qiu
1120850116348dacd6baf16645641c3383970e4a1157Peter Qiu        // Now create a dummy scan detail corresponding to the network.
1121850116348dacd6baf16645641c3383970e4a1157Peter Qiu        ScanDetail scanDetail = createScanDetailForNetwork(testNetwork);
1122850116348dacd6baf16645641c3383970e4a1157Peter Qiu        ScanResult scanResult = scanDetail.getScanResult();
1123850116348dacd6baf16645641c3383970e4a1157Peter Qiu
1124850116348dacd6baf16645641c3383970e4a1157Peter Qiu        mWifiConfigManager.updateScanDetailForNetwork(result.getNetworkId(), scanDetail);
1125850116348dacd6baf16645641c3383970e4a1157Peter Qiu
1126850116348dacd6baf16645641c3383970e4a1157Peter Qiu        // Now retrieve the scan detail cache and ensure that the new scan detail is in cache.
1127850116348dacd6baf16645641c3383970e4a1157Peter Qiu        ScanDetailCache retrievedScanDetailCache =
1128850116348dacd6baf16645641c3383970e4a1157Peter Qiu                mWifiConfigManager.getScanDetailCacheForNetwork(result.getNetworkId());
1129850116348dacd6baf16645641c3383970e4a1157Peter Qiu        assertEquals(1, retrievedScanDetailCache.size());
1130850116348dacd6baf16645641c3383970e4a1157Peter Qiu        ScanResult retrievedScanResult = retrievedScanDetailCache.get(scanResult.BSSID);
1131850116348dacd6baf16645641c3383970e4a1157Peter Qiu
1132850116348dacd6baf16645641c3383970e4a1157Peter Qiu        ScanTestUtil.assertScanResultEquals(scanResult, retrievedScanResult);
1133850116348dacd6baf16645641c3383970e4a1157Peter Qiu    }
1134850116348dacd6baf16645641c3383970e4a1157Peter Qiu
1135850116348dacd6baf16645641c3383970e4a1157Peter Qiu    /**
113622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies that scan detail cache is trimmed down when the size of the cache for a network
1137a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * exceeds {@link WifiConfigManager#SCAN_CACHE_ENTRIES_MAX_SIZE}.
113822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
113922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
114022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testScanDetailCacheTrimForNetwork() {
114122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Add a single network.
114222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
114322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
114422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
114522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetailCache scanDetailCache;
114622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        String testBssidPrefix = "00:a5:b8:c9:45:";
114722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
114822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Modify |BSSID| field in the scan result and add copies of scan detail
114922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // |SCAN_CACHE_ENTRIES_MAX_SIZE| times.
115022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        int scanDetailNum = 1;
1151a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        for (; scanDetailNum <= WifiConfigManager.SCAN_CACHE_ENTRIES_MAX_SIZE; scanDetailNum++) {
115222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // Create dummy scan detail caches with different BSSID for the network.
115322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            ScanDetail scanDetail =
115422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    createScanDetailForNetwork(
115522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                            openNetwork, String.format("%s%02x", testBssidPrefix, scanDetailNum));
115622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            assertNotNull(
115722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail));
115822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
115922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // The size of scan detail cache should keep growing until it hits
116022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // |SCAN_CACHE_ENTRIES_MAX_SIZE|.
116122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            scanDetailCache =
116222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId);
116322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            assertEquals(scanDetailNum, scanDetailCache.size());
116422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        }
116522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
116622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now add the |SCAN_CACHE_ENTRIES_MAX_SIZE + 1| entry. This should trigger the trim.
116722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail scanDetail =
116822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                createScanDetailForNetwork(
116922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                        openNetwork, String.format("%s%02x", testBssidPrefix, scanDetailNum));
117022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail));
117122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
117222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Retrieve the scan detail cache and ensure that the size was trimmed down to
117322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // |SCAN_CACHE_ENTRIES_TRIM_SIZE + 1|. The "+1" is to account for the new entry that
117422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // was added after the trim.
117522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        scanDetailCache = mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId);
1176a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        assertEquals(WifiConfigManager.SCAN_CACHE_ENTRIES_TRIM_SIZE + 1, scanDetailCache.size());
117722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
117822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
117922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
11802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is false for a newly added network.
11812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testAddNetworkHasEverConnectedFalse() {
11842d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(WifiConfigurationTestUtil.createOpenNetwork());
11852d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11862d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11872d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11882d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is false for a newly added network even when new config has
11892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * mistakenly set HasEverConnected to true.
11902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testAddNetworkOverridesHasEverConnectedWhenTrueInNewConfig() {
11932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
11942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
11952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(openNetwork);
11962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verify that the |HasEverConnected| is set when
1200a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkAfterConnect(int)} is invoked.
12012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
1203cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius    public void testUpdateConfigAfterConnectHasEverConnectedTrue() {
12042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
12052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(openNetwork);
12062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(openNetwork.networkId);
12072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |preSharedKey| is updated.
12112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdatePreSharedKeyClearsHasEverConnected() {
12142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
12152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
12162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
12172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different psk.
12192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.preSharedKey.equals("newpassword"));
12202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.preSharedKey = "newpassword";
12212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
12222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |wepKeys| is updated.
12262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateWepKeysClearsHasEverConnected() {
12292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
12302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(wepNetwork);
12312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(wepNetwork.networkId);
12322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different wep.
12342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(wepNetwork.wepKeys[0].equals("newpassword"));
12352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        wepNetwork.wepKeys[0] = "newpassword";
12362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(wepNetwork);
12372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |wepTxKeyIndex| is updated.
12412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateWepTxKeyClearsHasEverConnected() {
12442d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
12452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(wepNetwork);
12462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(wepNetwork.networkId);
12472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different wep.
12492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(wepNetwork.wepTxKeyIndex == 3);
12502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        wepNetwork.wepTxKeyIndex = 3;
12512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(wepNetwork);
12522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedKeyManagement| is
12562d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
12572d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12582d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12592d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedKeyManagementClearsHasEverConnected() {
12602d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
12612d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
12622d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
12632d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12642d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
12652d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
12662d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
12672d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12682d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12692d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12702d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedProtocol| is
12712d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
12722d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12732d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12742d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateProtocolsClearsHasEverConnected() {
12752d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
12762d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
12772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
12782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12792d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedProtocols.get(WifiConfiguration.Protocol.OSEN));
12802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedProtocols.set(WifiConfiguration.Protocol.OSEN);
12812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
12822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12842d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12852d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedAuthAlgorithms| is
12862d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
12872d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12882d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedAuthAlgorithmsClearsHasEverConnected() {
12902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
12912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
12922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
12932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedAuthAlgorithms.get(WifiConfiguration.AuthAlgorithm.LEAP));
12952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.LEAP);
12962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
12972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
13002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedPairwiseCiphers| is
13012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
13022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
13032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
13042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedPairwiseCiphersClearsHasEverConnected() {
13052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
13062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
13072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
13082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.NONE));
13102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.NONE);
13112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
13122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
13132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
13152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedGroup| is
13162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
13172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
13182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
13192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedGroupCiphersClearsHasEverConnected() {
13202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
13212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
13222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
13232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue(pskNetwork.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.WEP104));
13252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedGroupCiphers.clear(WifiConfiguration.GroupCipher.WEP104);
13262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
13272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
13282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
13302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |hiddenSSID| is
13312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
13322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
13332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
13342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateHiddenSSIDClearsHasEverConnected() {
13352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
13362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
13372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
13382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.hiddenSSID);
13402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.hiddenSSID = true;
13412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
13422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
13432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13442d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
13452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is not cleared when a network config |requirePMF| is
13462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
13472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
13482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
13492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateRequirePMFDoesNotClearHasEverConnected() {
13502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
13512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
13522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
13532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.requirePMF);
13552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.requirePMF = true;
13562d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13572d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result =
13582d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(pskNetwork);
13592d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
13602d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
13612d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue("Updating network non-credentials config should not clear hasEverConnected.",
13622d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
1363edf8be948c0879a2153582e853dc048f3060512aRoshan Pius        assertFalse(result.hasCredentialChanged());
13642d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
13652d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13662d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
13672d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |enterpriseConfig| is
13682d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
13692d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
13702d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
13712d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateEnterpriseConfigClearsHasEverConnected() {
13722d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
13732d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        eapNetwork.enterpriseConfig =
13742d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
13752d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(eapNetwork);
13762d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(eapNetwork.networkId);
13772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(eapNetwork.enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS);
13792d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        eapNetwork.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
13802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(eapNetwork);
13812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
13822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
13832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
1384327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius     * Verifies that if the app sends back the masked passwords in an update, we ignore it.
1385327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius     */
1386327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius    @Test
1387327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius    public void testUpdateIgnoresMaskedPasswords() {
1388327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        WifiConfiguration someRandomNetworkWithAllMaskedFields =
1389327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                WifiConfigurationTestUtil.createEapNetwork();
1390327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        someRandomNetworkWithAllMaskedFields.wepKeys = WifiConfigurationTestUtil.TEST_WEP_KEYS;
1391327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        someRandomNetworkWithAllMaskedFields.preSharedKey = WifiConfigurationTestUtil.TEST_PSK;
1392327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        someRandomNetworkWithAllMaskedFields.enterpriseConfig.setPassword(
1393327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                WifiConfigurationTestUtil.TEST_EAP_PASSWORD);
1394327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius
1395327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        NetworkUpdateResult result =
1396327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                verifyAddNetworkToWifiConfigManager(someRandomNetworkWithAllMaskedFields);
1397327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius
1398327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        // All of these passwords must be masked in this retrieved network config.
1399327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        WifiConfiguration retrievedNetworkWithMaskedPassword =
1400327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
1401327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedNetworkWithMaskedPassword);
1402327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        // Ensure that the passwords are present internally.
1403327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        WifiConfiguration retrievedNetworkWithPassword =
1404327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(result.getNetworkId());
1405327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertEquals(someRandomNetworkWithAllMaskedFields.preSharedKey,
1406327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                retrievedNetworkWithPassword.preSharedKey);
1407327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertEquals(someRandomNetworkWithAllMaskedFields.wepKeys,
1408327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                retrievedNetworkWithPassword.wepKeys);
1409327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertEquals(someRandomNetworkWithAllMaskedFields.enterpriseConfig.getPassword(),
1410327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                retrievedNetworkWithPassword.enterpriseConfig.getPassword());
1411327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius
1412327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        // Now update the same network config using the masked config.
1413327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        verifyUpdateNetworkToWifiConfigManager(retrievedNetworkWithMaskedPassword);
1414327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius
1415327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        // Retrieve the network config with password and ensure that they have not been overwritten
1416327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        // with *.
1417327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        retrievedNetworkWithPassword =
1418327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(result.getNetworkId());
1419327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertEquals(someRandomNetworkWithAllMaskedFields.preSharedKey,
1420327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                retrievedNetworkWithPassword.preSharedKey);
1421327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertEquals(someRandomNetworkWithAllMaskedFields.wepKeys,
1422327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                retrievedNetworkWithPassword.wepKeys);
1423327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius        assertEquals(someRandomNetworkWithAllMaskedFields.enterpriseConfig.getPassword(),
1424327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius                retrievedNetworkWithPassword.enterpriseConfig.getPassword());
1425327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius    }
1426327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius
1427327bd4253115abc757ebaf5f1bddd9f5ad2253e4Roshan Pius    /**
1428fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius     * Verifies the ordering of network list generated using
1429a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#retrievePnoNetworkList()}.
1430fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius     */
1431fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    @Test
1432fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    public void testRetrievePnoList() {
1433fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Create and add 3 networks.
1434fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork();
1435fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
1436fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
1437fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network1);
1438fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network2);
1439fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network3);
1440fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1441fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Enable all of them.
1442a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network1.networkId, false, TEST_CREATOR_UID));
1443a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network2.networkId, false, TEST_CREATOR_UID));
1444a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network3.networkId, false, TEST_CREATOR_UID));
1445fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1446fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now set scan results in 2 of them to set the corresponding
1447fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
1448fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
1449fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
1450fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
1451fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
1452fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1453fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now increment |network3|'s association count. This should ensure that this network
1454fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // is preferred over |network1|.
1455fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
1456fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1457fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Retrieve the Pno network list & verify the order of the networks returned.
1458fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
1459fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                mWifiConfigManager.retrievePnoNetworkList();
1460fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(3, pnoNetworks.size());
1461fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network3.SSID, pnoNetworks.get(0).ssid);
1462fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network1.SSID, pnoNetworks.get(1).ssid);
1463fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network2.SSID, pnoNetworks.get(2).ssid);
1464fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1465fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now permanently disable |network3|. This should remove network 3 from the list.
1466fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.disableNetwork(network3.networkId, TEST_CREATOR_UID));
1467fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1468fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Retrieve the Pno network list again & verify the order of the networks returned.
1469fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        pnoNetworks = mWifiConfigManager.retrievePnoNetworkList();
1470fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(2, pnoNetworks.size());
1471fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network1.SSID, pnoNetworks.get(0).ssid);
1472fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network2.SSID, pnoNetworks.get(1).ssid);
1473fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    }
1474fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1475fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    /**
14768600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have the same default GW Mac address in
1477a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
14788600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
14798600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
14808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingGwMacAddress() {
14818600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
14828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
14838600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
14848600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
14858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
14868600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
14878600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14888600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Set the same default GW mac address for all of the networks.
14898600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14908600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
14918600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14928600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
14938600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14948600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network3.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
14958600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14968600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now create dummy scan detail corresponding to the networks.
14978600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1);
14988600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2);
14998600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail3 = createScanDetailForNetwork(network3);
15008600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15018600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
15028600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
15038600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
15048600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
15058600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail3));
15068600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15078600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
15088600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
15098600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
15108600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(2, network.linkedConfigurations.size());
15118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
15128600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
15138600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
15148600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
15158600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
15168600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
15178600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
15188600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
15198600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15208600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
15218600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have scan results with same first 16 ASCII of
15228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * bssid in
1523a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
15248600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
15258600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
15268600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingBSSIDMatch() {
15278600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
15288600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
15298600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
15308600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
15318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
15328600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
15338600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15348600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
15358600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
15368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
15378600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail3 = createScanDetailForNetwork(network3, "af:89:56:34:56:69");
15388600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15398600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
15408600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
15418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
15428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
15438600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail3));
15448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15458600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
15468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
15478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
15488600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(2, network.linkedConfigurations.size());
15498600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
15508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
15518600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
15528600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
15538600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
15548600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
15558600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
15568600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
15578600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15588600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
15598600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks does not happen for non WPA networks when they have scan
15608600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * results with same first 16 ASCII of bssid in
1561a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
15628600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
15638600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
15648600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNoNetworkLinkUsingBSSIDMatchForNonWpaNetworks() {
15658600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
15668600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
15678600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
15688600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
15698600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15708600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
15718600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
15728600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
15738600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15748600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
15758600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
15768600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15778600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
15788600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
15798600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
15808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
15818600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
15828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
15838600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15848600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
15858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks does not happen for networks with more than
1586a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#LINK_CONFIGURATION_MAX_SCAN_CACHE_ENTRIES} scan
15878600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * results with same first 16 ASCII of bssid in
1588a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
15898600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
15908600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
15918600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNoNetworkLinkUsingBSSIDMatchForNetworksWithHighScanDetailCacheSize() {
15928600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
15938600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
15948600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
15958600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
15968600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
15978600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create 7 scan results with bssid which is different in only the last char.
15988600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
15998600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        int scan_result_num = 0;
1600a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        for (; scan_result_num < WifiConfigManager.LINK_CONFIGURATION_MAX_SCAN_CACHE_ENTRIES + 1;
16012dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius             scan_result_num++) {
16028600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            ScanDetail networkScanDetail =
16038600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    createScanDetailForNetwork(
16048600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                            network1, test_bssid_base + Integer.toString(scan_result_num));
16058600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNotNull(
16068600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
16078600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
16088600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16098600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now add 1 scan result to the other network with bssid which is different in only the
16108600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // last char.
16118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 =
16128600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(
16138600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                        network2, test_bssid_base + Integer.toString(scan_result_num++));
16148600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
16158600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16168600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
16178600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
16188600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
16198600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
16208600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
16218600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
16228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16238600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
16248600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have scan results with same first 16 ASCII of
1625a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * bssid in {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}
16268600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * and then subsequently delinked when the networks have default gateway set which do not match.
16278600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
16288600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
16298600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingBSSIDMatchAndThenUnlinkDueToGwMacAddress() {
16308600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
16318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
16328600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
16338600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
16348600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16358600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
16368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
16378600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
16388600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16398600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
16408600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
16418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
16428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
16438600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
16458600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
16468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
16478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(1, network.linkedConfigurations.size());
16488600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
16498600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
16508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
16518600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
16528600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
16538600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
16548600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
16558600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16568600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now Set different GW mac address for both the networks and ensure they're unlinked.
16578600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
16588600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network1.networkId, "de:ad:fe:45:23:34"));
16598600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
16608600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network2.networkId, "ad:de:fe:45:23:34"));
16618600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16628600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Add some dummy scan results again to re-evaluate the linking of networks.
16638600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
16648600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(network1, "af:89:56:34:45:67")));
16658600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
16668600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(network1, "af:89:56:34:45:68")));
16678600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
16688600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworks();
16698600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
16708600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
16718600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
16728600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
16738600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
167460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    /**
16752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
167660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)}.
16772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
16782dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
16792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetwork() {
16802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
16812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
16822dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
16842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
16852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
16862dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
16872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
16882dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
16892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
16902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
16912dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
16932dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
169460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network.networkId, 1,
16952ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        TEST_FREQ_LIST[4]));
169660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    }
169760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
169860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    /**
169960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * Verifies the creation of channel list using
170060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
170160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that the frequenecy of the currently connected network is in the returned
170260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * channel set.
170360ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     */
170460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    @Test
170560ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    public void testFetchChannelSetForNetworkIncludeCurrentNetwork() {
170660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
170760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        verifyAddNetworkToWifiConfigManager(network);
170860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
170960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        // Create 5 scan results with different bssid's & frequencies.
171060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        String test_bssid_base = "af:89:56:34:56:6";
171160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
171260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan            ScanDetail networkScanDetail =
171360ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                    createScanDetailForNetwork(
171460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
171560ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan            assertNotNull(
171660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
171760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
171860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        }
171960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
172060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        // Currently connected network frequency 2427 is not in the TEST_FREQ_LIST
172160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        Set<Integer> freqs = mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
172260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                network.networkId, 1, 2427);
172360ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
172460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        assertEquals(true, freqs.contains(2427));
17252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
17262dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17272dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
17282dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
172960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
173060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that scan results which have a timestamp  beyond the provided age are not used
173160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * in the channel list.
17322dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
17332dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
17342dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIgnoresStaleScanResults() {
17352dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
17362dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
17372dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        long wallClockBase = 0;
17392dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
17402dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
17412dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
17422dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            // Increment the seen value in the scan results for each of them.
17432dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            when(mClock.getWallClockMillis()).thenReturn(wallClockBase + i);
17442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
17452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
17462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
17472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
17482dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
17492dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17502dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
17512dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int ageInMillis = 4;
17522dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Now fetch only scan results which are 4 millis stale. This should ignore the first
17532dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // scan result.
17542dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(
17552dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                new HashSet<>(Arrays.asList(
17562dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        Arrays.copyOfRange(
17572dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                                TEST_FREQ_LIST,
17582dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                                TEST_FREQ_LIST.length - ageInMillis, TEST_FREQ_LIST.length))),
17592dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
176060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network.networkId, ageInMillis, TEST_FREQ_LIST[4]));
17612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
17622dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17632dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
17642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
176560ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
176660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that the list size does not exceed the max configured for the device.
17672dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
17682dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
17692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIsLimitedToConfiguredSize() {
1770a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        // Need to recreate the WifiConfigManager instance for this test to modify the config
17712dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // value which is read only in the constructor.
17722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int maxListSize = 3;
17732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
17742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
17752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                maxListSize);
17762dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
17772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17782dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
17792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
17802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
17822dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
17832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
17842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
17852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
17862dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
17872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
17882dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
17892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
17912dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Ensure that the fetched list size is limited.
17922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
17932dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
179460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network.networkId, 1, TEST_FREQ_LIST[4]).size());
17952dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
17962dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17972dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
17982dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
179960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
180060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that scan results from linked networks are used in the channel list.
18012dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
18022dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
18032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIncludesLinkedNetworks() {
18042dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
18052dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
18062dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
18072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
18082dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
18102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int TEST_FREQ_LISTIdx = 0;
18112dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 1.
18122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
18132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
18142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
18152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
18162dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
18172dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
18182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
18192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18202dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
18212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 2.
18222dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
18232dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
18242dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
18252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
18262dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
18272dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
18282dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
18292dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
18302dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18312dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Link the 2 configurations together using the GwMacAddress.
18322dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
18332dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
18342dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
18352dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
18362dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18372dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // The channel list fetched should include scan results from both the linked networks.
18382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
183960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network1.networkId, 1,
18402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        TEST_FREQ_LIST[0]));
18412dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
184260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network2.networkId, 1,
18432ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        TEST_FREQ_LIST[0]));
18442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
18452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
18472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
184860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
184960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that scan results from linked networks are used in the channel list and that the
185060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * list size does not exceed the max configured for the device.
18512dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
18522dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
18532dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIncludesLinkedNetworksIsLimitedToConfiguredSize() {
1854a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        // Need to recreate the WifiConfigManager instance for this test to modify the config
18552dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // value which is read only in the constructor.
18562dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int maxListSize = 3;
18572dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
18582dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
18592dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                maxListSize);
18602dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
18622dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
18632dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
18642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
18652dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
18662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18672dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
18682dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int TEST_FREQ_LISTIdx = 0;
18692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 1.
18702dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
18712dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
18722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
18732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
18742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
18752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
18762dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
18772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18782dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
18792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 2.
18802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
18812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
18822dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
18832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
18842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
18852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
18862dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
18872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
18882dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Link the 2 configurations together using the GwMacAddress.
18902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
18912dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
18922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
18932dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
18942dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
18952dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Ensure that the fetched list size is limited.
18962dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
18972dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
189860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network1.networkId, 1, TEST_FREQ_LIST[0]).size());
18992dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
19002dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
190160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network2.networkId, 1, TEST_FREQ_LIST[0]).size());
19022dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
19032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
1904c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
1905a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
19062ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * and ensures that any shared private networks networkId is not changed.
19072ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Test scenario:
19082ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 1. Load the shared networks from shared store and user 1 store.
19092ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 2. Switch to user 2 and ensure that the shared network's Id is not changed.
19102ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     */
19112ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    @Test
19122ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    public void testHandleUserSwitchDoesNotChangeSharedNetworksId() throws Exception {
19132ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user1 = TEST_DEFAULT_USER;
19142ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
19152ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        setupUserProfiles(user2);
19162ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19172ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int appId = 674;
19182ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19192ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
19202ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
19212ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.shared = false;
19222ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
19232ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
19242ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.shared = false;
19252ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
19262ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration sharedNetwork1 = WifiConfigurationTestUtil.createPskNetwork();
19272ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration sharedNetwork2 = WifiConfigurationTestUtil.createPskNetwork();
19282ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19292ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the store data that is loaded initially.
19302ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
19312ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
19322ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork1);
19332ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork2);
19342ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
19352ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
19362ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user1Networks = new ArrayList<WifiConfiguration>() {
19372ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
19382ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user1Network);
19392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
19402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
19410a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForRead(sharedNetworks, user1Networks, new HashSet<String>());
19422ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
19430a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).read();
19442ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19452ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Fetch the network ID's assigned to the shared networks initially.
19462ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int sharedNetwork1Id = WifiConfiguration.INVALID_NETWORK_ID;
19472ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int sharedNetwork2Id = WifiConfiguration.INVALID_NETWORK_ID;
19482ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> retrievedNetworks =
19492ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
19502ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
19512ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            if (network.configKey().equals(sharedNetwork1.configKey())) {
19522ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                sharedNetwork1Id = network.networkId;
19532ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            } else if (network.configKey().equals(sharedNetwork2.configKey())) {
19542ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                sharedNetwork2Id = network.networkId;
19552ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
19562ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        }
19572ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(sharedNetwork1Id != WifiConfiguration.INVALID_NETWORK_ID);
19582ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(sharedNetwork2Id != WifiConfiguration.INVALID_NETWORK_ID);
19592ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19602ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the user 2 store data that is loaded at user switch.
19612ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() {
19622ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
19632ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user2Network);
19642ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
19652ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
19660a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(user2Networks, new HashSet<String>());
19672ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now switch the user to user 2 and ensure that shared network's IDs have not changed.
19682ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
19692ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mWifiConfigManager.handleUserSwitch(user2);
19700a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
19712ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19722ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Again fetch the network ID's assigned to the shared networks and ensure they have not
19732ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // changed.
19742ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int updatedSharedNetwork1Id = WifiConfiguration.INVALID_NETWORK_ID;
19752ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int updatedSharedNetwork2Id = WifiConfiguration.INVALID_NETWORK_ID;
19762ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
19772ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
19782ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            if (network.configKey().equals(sharedNetwork1.configKey())) {
19792ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                updatedSharedNetwork1Id = network.networkId;
19802ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            } else if (network.configKey().equals(sharedNetwork2.configKey())) {
19812ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                updatedSharedNetwork2Id = network.networkId;
19822ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
19832ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        }
19842ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertEquals(sharedNetwork1Id, updatedSharedNetwork1Id);
19852ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertEquals(sharedNetwork2Id, updatedSharedNetwork2Id);
19862ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    }
19872ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19882ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    /**
19892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
19902ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * and ensures that any old user private networks are not visible anymore.
19912ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Test scenario:
19922ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 1. Load the shared networks from shared store and user 1 store.
19932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 2. Switch to user 2 and ensure that the user 1's private network has been removed.
19942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     */
19952ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    @Test
19962ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    public void testHandleUserSwitchRemovesOldUserPrivateNetworks() throws Exception {
19972ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user1 = TEST_DEFAULT_USER;
19982ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
19992ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        setupUserProfiles(user2);
20002ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
20012ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int appId = 674;
20022ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
20032ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
20042ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
20052ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.shared = false;
20062ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
20072ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
20082ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.shared = false;
20092ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
20102ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
20112ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
20122ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the store data that is loaded initially.
20132ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
20142ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
20152ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork);
20162ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
20172ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
20182ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user1Networks = new ArrayList<WifiConfiguration>() {
20192ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
20202ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user1Network);
20212ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
20222ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
20230a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForRead(sharedNetworks, user1Networks, new HashSet<String>());
20242ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
20250a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).read();
20262ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
20271cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Fetch the network ID assigned to the user 1 network initially.
20281cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int user1NetworkId = WifiConfiguration.INVALID_NETWORK_ID;
20291cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        List<WifiConfiguration> retrievedNetworks =
20301cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
20311cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
20321cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            if (network.configKey().equals(user1Network.configKey())) {
20331cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                user1NetworkId = network.networkId;
20341cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            }
20351cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        }
20361cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20372ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the user 2 store data that is loaded at user switch.
20382ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() {
20392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
20402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user2Network);
20412ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
20422ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
20430a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(user2Networks, new HashSet<String>());
20442ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now switch the user to user 2 and ensure that user 1's private network has been removed.
20452ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
20461cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        Set<Integer> removedNetworks = mWifiConfigManager.handleUserSwitch(user2);
20470a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
20481cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue((removedNetworks.size() == 1) && (removedNetworks.contains(user1NetworkId)));
20492ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
20502ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set the expected networks to be |sharedNetwork| and |user2Network|.
20512ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> expectedNetworks = new ArrayList<WifiConfiguration>() {
20522ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
20532ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork);
20542ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user2Network);
20552ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
20562ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
20572ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
20582ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                expectedNetworks, mWifiConfigManager.getConfiguredNetworksWithPasswords());
20591cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20601cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Send another user switch  indication with the same user 2. This should be ignored and
20611cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // hence should not remove any new networks.
20621cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
20631cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        removedNetworks = mWifiConfigManager.handleUserSwitch(user2);
20641cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue(removedNetworks.isEmpty());
20651cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    }
20661cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20671cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    /**
20681cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
20691cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * and ensures that user switch from a user with no private networks is handled.
20701cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * Test scenario:
20711cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * 1. Load the shared networks from shared store and emptu user 1 store.
20721cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * 2. Switch to user 2 and ensure that no private networks were removed.
20731cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     */
20741cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    @Test
20751cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    public void testHandleUserSwitchWithNoOldUserPrivateNetworks() throws Exception {
20761cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int user1 = TEST_DEFAULT_USER;
20771cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
20781cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        setupUserProfiles(user2);
20791cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20801cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int appId = 674;
20811cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20821cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Create 2 networks. 1 for user2 and 1 shared.
20831cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
20841cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        user2Network.shared = false;
20851cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
20861cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
20871cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20881cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Set up the store data that is loaded initially.
20891cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
20901cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            {
20911cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                add(sharedNetwork);
20921cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            }
20931cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        };
20940a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForRead(sharedNetworks, new ArrayList<WifiConfiguration>(),
20950a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                new HashSet<String>());
20961cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
20970a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).read();
20981cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
20991cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Set up the user 2 store data that is loaded at user switch.
21001cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() {
21011cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            {
21021cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                add(user2Network);
21031cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            }
21041cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        };
21050a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(user2Networks, new HashSet<String>());
21061cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Now switch the user to user 2 and ensure that no private network has been removed.
21071cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
21081cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        Set<Integer> removedNetworks = mWifiConfigManager.handleUserSwitch(user2);
21090a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
21101cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue(removedNetworks.isEmpty());
21112ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    }
21122ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
21132ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    /**
21142ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
2115c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * and ensures that any non current user private networks are moved to shared store file.
21161cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * This test simulates the following test case:
21172ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 1. Loads the shared networks from shared store at bootup.
21182ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 2. Load the private networks from user store on user 1 unlock.
21192ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 3. Switch to user 2 and ensure that the user 2's private network has been moved to user 2's
21202ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * private store file.
2121c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2122c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
2123c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchPushesOtherPrivateNetworksToSharedStore() throws Exception {
21246d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
21256d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2126c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2127c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2128c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        int appId = 674;
2129c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2130c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
2131c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
2132c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user1Network.shared = false;
2133c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
2134c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
2135c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user2Network.shared = false;
2136c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
2137c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
2138c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
21392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the shared store data that is loaded at bootup. User 2's private network
21402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // is still in shared store because they have not yet logged-in after upgrade.
2141c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
2142c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
2143c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(sharedNetwork);
2144c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user2Network);
2145c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2146c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
21470a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForRead(sharedNetworks, new ArrayList<WifiConfiguration>(),
21480a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                new HashSet<String>());
21492ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
21500a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).read();
21512ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
21522ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the user store data that is loaded at user unlock.
2153c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> userNetworks = new ArrayList<WifiConfiguration>() {
2154c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
2155c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user1Network);
2156c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2157c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
21580a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(userNetworks, new HashSet<String>());
21592ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
21600a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        verify(mWifiConfigStore).switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
21612ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Capture the written data for the user 1 and ensure that it corresponds to what was
21622ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // setup.
21630a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        Pair<List<WifiConfiguration>, List<WifiConfiguration>> writtenNetworkList =
21640a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                captureWriteNetworksListStoreData();
21652ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
21660a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                sharedNetworks, writtenNetworkList.first);
21672ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
21680a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                userNetworks, writtenNetworkList.second);
2169c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
21702ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now switch the user to user2 and ensure that user 2's private network has been moved to
21712ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // the user store.
21722ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2173c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2174c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Set the expected network list before comparing. user1Network should be in shared data.
2175c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Note: In the real world, user1Network will no longer be visible now because it should
2176c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // already be in user1's private store file. But, we're purposefully exposing it
2177c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // via |loadStoreData| to test if other user's private networks are pushed to shared store.
2178c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> expectedSharedNetworks = new ArrayList<WifiConfiguration>() {
2179c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
2180c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(sharedNetwork);
2181c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user1Network);
2182c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2183c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
2184c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> expectedUserNetworks = new ArrayList<WifiConfiguration>() {
2185c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
2186c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user2Network);
2187c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2188c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
21892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Capture the first written data triggered for saving the old user's network
21902ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // configurations.
21910a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        writtenNetworkList = captureWriteNetworksListStoreData();
21922ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
21930a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                sharedNetworks, writtenNetworkList.first);
21942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
21950a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                userNetworks, writtenNetworkList.second);
2196c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
21972ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now capture the next written data triggered after the switch and ensure that user 2's
21982ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // network is now in user store data.
21990a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        writtenNetworkList = captureWriteNetworksListStoreData();
2200c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
22010a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                expectedSharedNetworks, writtenNetworkList.first);
2202c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
22030a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                expectedUserNetworks, writtenNetworkList.second);
2204c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2205c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2206c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
22075e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * Verify that unlocking an user that owns a legacy Passpoint configuration (which is stored
22085e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * temporarily in the share store) will migrate it to PasspointManager and removed from
22095e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * the list of configured networks.
22105e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     *
22115e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * @throws Exception
22125e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     */
22135e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    @Test
22145e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    public void testHandleUserUnlockRemovePasspointConfigFromSharedConfig() throws Exception {
22155e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        int user1 = TEST_DEFAULT_USER;
22165e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        int appId = 674;
22175e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
22185e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        final WifiConfiguration passpointConfig =
22195e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu                WifiConfigurationTestUtil.createPasspointNetwork();
22205e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.creatorUid = UserHandle.getUid(user1, appId);
2221018e39e2f6201519373e7f4dbb1427f0e5274898Peter Qiu        passpointConfig.isLegacyPasspointConfig = true;
22225e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
22235e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Set up the shared store data to contain one legacy Passpoint configuration.
22245e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
22255e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu            {
22265e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu                add(passpointConfig);
22275e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu            }
22285e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        };
22295e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        setupStoreDataForRead(sharedNetworks, new ArrayList<WifiConfiguration>(),
22305e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu                new HashSet<String>());
22315e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertTrue(mWifiConfigManager.loadFromStore());
22325e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        verify(mWifiConfigStore).read();
22335e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertEquals(1, mWifiConfigManager.getConfiguredNetworks().size());
22345e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
22355e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Unlock the owner of the legacy Passpoint configuration, verify it is removed from
22365e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // the configured networks (migrated to PasspointManager).
22375e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
22385e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        mWifiConfigManager.handleUserUnlock(user1);
22395e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        verify(mWifiConfigStore).switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
22405e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Pair<List<WifiConfiguration>, List<WifiConfiguration>> writtenNetworkList =
22415e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu                captureWriteNetworksListStoreData();
22425e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertTrue(writtenNetworkList.first.isEmpty());
22435e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertTrue(writtenNetworkList.second.isEmpty());
22445e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
22455e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    }
22465e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
22475e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    /**
2248a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
2249a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * and {@link WifiConfigManager#handleUserUnlock(int)} and ensures that the new store is
2250c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * read immediately if the user is unlocked during the switch.
2251c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2252c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
2253c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchWhenUnlocked() throws Exception {
22546d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
22556d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2256c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2257c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2258d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // Set up the internal data first.
2259d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
2260d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
22610a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
2262c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // user2 is unlocked and switched to foreground.
2263c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2264c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2265c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Ensure that the read was invoked.
22662ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
22672ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2268c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2269c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2270c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2271a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
2272a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * and {@link WifiConfigManager#handleUserUnlock(int)} and ensures that the new store is not
2273c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * read until the user is unlocked.
2274c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2275c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchWhenLocked() throws Exception {
22766d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
22776d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2278c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2279c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2280d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // Set up the internal data first.
2281d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
2282d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
2283c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // user2 is locked and switched to foreground.
2284c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
2285c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2286c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2287c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Ensure that the read was not invoked.
22882ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
22892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2290c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2291c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now try unlocking some other user (user1), this should be ignored.
2292c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserUnlock(user1);
22932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
22942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2295c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
22960a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
2297c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Unlock the user2 and ensure that we read the data now.
2298c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserUnlock(user2);
22992ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
23002ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2301c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2302c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2303c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2304a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies that the foreground user stop using {@link WifiConfigManager#handleUserStop(int)}
2305c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * and ensures that the store is written only when the foreground user is stopped.
2306c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2307c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
2308c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserStop() throws Exception {
23096d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
23106d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2311c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2312c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2313c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Try stopping background user2 first, this should not do anything.
2314c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
2315c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserStop(user2);
23162ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
23172ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2318c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2319c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now try stopping the foreground user1, this should trigger a write to store.
2320c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserStop(user1);
23212ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
23222ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
23230a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(anyBoolean());
2324c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2325c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
23266d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    /**
2327b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)}
2328b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * results in a store read after bootup.
2329b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     */
2330b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    @Test
2331b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    public void testHandleUserUnlockAfterBootup() throws Exception {
2332b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user1 = TEST_DEFAULT_USER;
2333b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2334d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // Set up the internal data first.
2335d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
2336d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).read();
23370a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
2338d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
2339d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2340d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
23410a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
2342b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Unlock the user1 (default user) for the first time and ensure that we read the data.
2343b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
2344d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
2345d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
2346d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
23470a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(anyBoolean());
2348d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius    }
2349d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
2350d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius    /**
2351d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius     * Verifies that the store read after bootup received after
2352d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius     * foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)}
2353d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius     * results in a user store read.
2354d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius     */
2355d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius    @Test
2356d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius    public void testHandleBootupAfterUserUnlock() throws Exception {
2357d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        int user1 = TEST_DEFAULT_USER;
2358d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
2359d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // Unlock the user1 (default user) for the first time and ensure that we don't read the
2360d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // data.
2361d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
2362d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).read();
23630a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
2364d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
2365d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2366d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
23670a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
2368d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // Read from store now.
2369d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
23702ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
2371040829fe448045d12cbc90f6143aca7da6b5aa80Peter Qiu                .setUserStore(any(WifiConfigStore.StoreFile.class));
2372040829fe448045d12cbc90f6143aca7da6b5aa80Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore).read();
2373b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    }
2374b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2375b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    /**
2376b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)} does
2377b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * not always result in a store read unless the user had switched or just booted up.
2378b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     */
2379b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    @Test
2380b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    public void testHandleUserUnlockWithoutSwitchOrBootup() throws Exception {
2381b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user1 = TEST_DEFAULT_USER;
2382b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2383b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        setupUserProfiles(user2);
2384b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2385d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        // Set up the internal data first.
2386d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
2387d7e826a86f845e439715eae57d43731d1ca9a404Roshan Pius
23880a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
2389b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // user2 is unlocked and switched to foreground.
2390b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2391b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2392b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Ensure that the read was invoked.
23932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
23942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2395b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2396b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Unlock the user2 again and ensure that we don't read the data now.
2397b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserUnlock(user2);
23982ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
23992ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2400b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    }
2401b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2402b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    /**
24034f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserSwitch(int)}
24044f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * is ignored if the legacy store migration is not complete.
24054f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     */
24064f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    @Test
24074f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    public void testHandleUserSwitchAfterBootupBeforeLegacyStoreMigration() throws Exception {
24084f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
24094f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
24104f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // Switch to user2 for the first time and ensure that we don't read or
24114f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // write the store files.
24124f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
24134f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        mWifiConfigManager.handleUserSwitch(user2);
24144f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
24154f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
24160a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
24174f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    }
24184f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
24194f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    /**
24204f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)}
24214f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * is ignored if the legacy store migration is not complete.
24224f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     */
24234f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    @Test
24244f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    public void testHandleUserUnlockAfterBootupBeforeLegacyStoreMigration() throws Exception {
24254f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        int user1 = TEST_DEFAULT_USER;
24264f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
24274f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // Unlock the user1 (default user) for the first time and ensure that we don't read or
24284f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // write the store files.
24294f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
24304f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
24314f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
24320a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
24334f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    }
24344f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
24354f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    /**
24366d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * Verifies the private network addition using
2437a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
24386d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * by a non foreground user is rejected.
24396d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     */
24406d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    @Test
24416d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    public void testAddNetworkUsingBackgroundUserUId() throws Exception {
24426d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
24436d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(user2);
24446d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
24456d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int creatorUid = UserHandle.getUid(user2, 674);
24466d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
24476d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Create a network for user2 try adding it. This should be rejected.
24486d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
2449dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(user2Network, creatorUid);
24506d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertFalse(result.isSuccess());
24516d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    }
24526d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
24536d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    /**
24546d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * Verifies the private network addition using
2455a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
24566d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * by SysUI is always accepted.
24576d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     */
24586d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    @Test
24596d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    public void testAddNetworkUsingSysUiUid() throws Exception {
24606d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Set up the user profiles stuff. Needed for |WifiConfigurationUtil.isVisibleToAnyProfile|
24616d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
24626d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(user2);
24636d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
24646d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
24656d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
24666d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
24676d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Create a network for user2 try adding it. This should be rejected.
24686d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
2469dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(user2Network, TEST_SYSUI_UID);
24706d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertTrue(result.isSuccess());
24716d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    }
24726d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
24733a738a26918230b2469d917dbf14323234edd39bRoshan Pius    /**
24744f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#migrateFromLegacyStore()} ()}
24754f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * attempts to migrate data from legacy stores when the legacy store files are present.
24763a738a26918230b2469d917dbf14323234edd39bRoshan Pius     */
24773a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Test
24783a738a26918230b2469d917dbf14323234edd39bRoshan Pius    public void testMigrationFromLegacyStore() throws Exception {
24793a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Create the store data to be returned from legacy stores.
24803a738a26918230b2469d917dbf14323234edd39bRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
24813a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createPskNetwork());
24823a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createEapNetwork());
24833a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createWepNetwork());
2484674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        String deletedEphemeralSSID = "EphemeralSSID";
2485674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        Set<String> deletedEphermalSSIDs = new HashSet<>(Arrays.asList(deletedEphemeralSSID));
24863a738a26918230b2469d917dbf14323234edd39bRoshan Pius        WifiConfigStoreDataLegacy storeData =
2487674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius                new WifiConfigStoreDataLegacy(networks, deletedEphermalSSIDs);
24883a738a26918230b2469d917dbf14323234edd39bRoshan Pius
24893a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(true);
24903a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.read()).thenReturn(storeData);
24913a738a26918230b2469d917dbf14323234edd39bRoshan Pius
24924f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // Now trigger the migration from legacy store. This should populate the in memory list with
24934f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // all the networks above from the legacy store.
24944f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        assertTrue(mWifiConfigManager.migrateFromLegacyStore());
24953a738a26918230b2469d917dbf14323234edd39bRoshan Pius
24963a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStoreLegacy).read();
2497b2c8d28046e96c4506482e030c6320cda6db8f30Roshan Pius        verify(mWifiConfigStoreLegacy).removeStores();
24983a738a26918230b2469d917dbf14323234edd39bRoshan Pius
24993a738a26918230b2469d917dbf14323234edd39bRoshan Pius        List<WifiConfiguration> retrievedNetworks =
25003a738a26918230b2469d917dbf14323234edd39bRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
25013a738a26918230b2469d917dbf14323234edd39bRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
25023a738a26918230b2469d917dbf14323234edd39bRoshan Pius                networks, retrievedNetworks);
2503674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        assertTrue(mWifiConfigManager.wasEphemeralNetworkDeleted(deletedEphemeralSSID));
25043a738a26918230b2469d917dbf14323234edd39bRoshan Pius    }
25053a738a26918230b2469d917dbf14323234edd39bRoshan Pius
25063a738a26918230b2469d917dbf14323234edd39bRoshan Pius    /**
25074f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#migrateFromLegacyStore()} ()}
25084f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * does not attempt to migrate data from legacy stores when the legacy store files are absent
25094f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     * (i.e migration was already done once).
25104f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius     */
25114f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    @Test
25124f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    public void testNoDuplicateMigrationFromLegacyStore() throws Exception {
25134f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(false);
25144f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
25154f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        // Now trigger a migration from legacy store.
25164f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        assertTrue(mWifiConfigManager.migrateFromLegacyStore());
25174f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
25184f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        verify(mWifiConfigStoreLegacy, never()).read();
25194f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        verify(mWifiConfigStoreLegacy, never()).removeStores();
25204f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    }
25214f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius
25224f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius    /**
2523a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#loadFromStore()} does
25243a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * not attempt to read from any of the stores (new or legacy) when the store files are
25253a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * not present.
25263a738a26918230b2469d917dbf14323234edd39bRoshan Pius     */
25273a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Test
25283a738a26918230b2469d917dbf14323234edd39bRoshan Pius    public void testFreshInstallDoesNotLoadFromStore() throws Exception {
25293a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(false);
25303a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(false);
25313a738a26918230b2469d917dbf14323234edd39bRoshan Pius
25324f294fab991c91d629b9dfab5ed3a35a69ed3ce6Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
25333a738a26918230b2469d917dbf14323234edd39bRoshan Pius
25343a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStore, never()).read();
25353a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStoreLegacy, never()).read();
25363a738a26918230b2469d917dbf14323234edd39bRoshan Pius
25373a738a26918230b2469d917dbf14323234edd39bRoshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworksWithPasswords().isEmpty());
25383a738a26918230b2469d917dbf14323234edd39bRoshan Pius    }
25393a738a26918230b2469d917dbf14323234edd39bRoshan Pius
2540a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    /**
2541249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius     * Verifies the user switch using {@link WifiConfigManager#handleUserSwitch(int)} is handled
2542249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius     * when the store files (new or legacy) are not present.
2543249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius     */
2544249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius    @Test
2545249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius    public void testHandleUserSwitchAfterFreshInstall() throws Exception {
2546249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2547249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(false);
2548249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(false);
2549249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius
2550249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
2551249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        verify(mWifiConfigStore, never()).read();
2552249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        verify(mWifiConfigStoreLegacy, never()).read();
2553249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius
25540a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        setupStoreDataForUserRead(new ArrayList<WifiConfiguration>(), new HashSet<String>());
2555249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        // Now switch the user to user 2.
2556249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2557249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2558249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        // Ensure that the read was invoked.
2559249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
2560249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2561249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius    }
2562249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius
2563249f241b74b783d8c42af201d40f453ea637b32aRoshan Pius    /**
2564a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius     * Verifies that the last user selected network parameter is set when
2565a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} with disableOthers flag is set
2566a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * to true and cleared when either {@link WifiConfigManager#disableNetwork(int, int)} or
2567a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int, int)} is invoked using the same network ID.
2568a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius     */
2569a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    @Test
2570a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    public void testLastSelectedNetwork() throws Exception {
2571a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
2572a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
2573a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2574a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        when(mClock.getElapsedSinceBootMillis()).thenReturn(67L);
2575a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
2576a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), true, TEST_CREATOR_UID));
2577a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(result.getNetworkId(), mWifiConfigManager.getLastSelectedNetwork());
2578a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(67, mWifiConfigManager.getLastSelectedTimeStamp());
2579a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2580a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        // Now disable the network and ensure that the last selected flag is cleared.
2581a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_CREATOR_UID));
2582a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(
2583a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                WifiConfiguration.INVALID_NETWORK_ID, mWifiConfigManager.getLastSelectedNetwork());
2584a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2585a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        // Enable it again and remove the network to ensure that the last selected flag was cleared.
2586a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
2587a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), true, TEST_CREATOR_UID));
2588a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(result.getNetworkId(), mWifiConfigManager.getLastSelectedNetwork());
258965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertEquals(openNetwork.configKey(), mWifiConfigManager.getLastSelectedNetworkConfigKey());
2590a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2591a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(result.getNetworkId(), TEST_CREATOR_UID));
2592a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(
2593a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                WifiConfiguration.INVALID_NETWORK_ID, mWifiConfigManager.getLastSelectedNetwork());
2594a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    }
2595a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
259665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    /**
259765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     * Verifies that all the networks for the provided app is removed when
2598a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetworksForApp(ApplicationInfo)} is invoked.
259965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     */
260065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    @Test
260165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    public void testRemoveNetworksForApp() throws Exception {
260265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createOpenNetwork());
260365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createPskNetwork());
260465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createWepNetwork());
260565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
260665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
260765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
260865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        ApplicationInfo app = new ApplicationInfo();
260965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        app.uid = TEST_CREATOR_UID;
261065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        app.packageName = TEST_CREATOR_NAME;
26111fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee        assertEquals(3, mWifiConfigManager.removeNetworksForApp(app).size());
261265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
261365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        // Ensure all the networks are removed now.
261465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
261565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    }
261665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
261765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    /**
261865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     * Verifies that all the networks for the provided user is removed when
2619a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetworksForUser(int)} is invoked.
262065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     */
262165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    @Test
262265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    public void testRemoveNetworksForUser() throws Exception {
262365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createOpenNetwork());
262465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createPskNetwork());
262565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createWepNetwork());
262665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
262765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
262865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
26291fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee        assertEquals(3, mWifiConfigManager.removeNetworksForUser(TEST_DEFAULT_USER).size());
263065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
263165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        // Ensure all the networks are removed now.
263265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
263365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    }
263465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
2635b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    /**
2636b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius     * Verifies that the connect choice is removed from all networks when
2637a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int, int)} is invoked.
2638b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius     */
2639b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    @Test
2640b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    public void testRemoveNetworkRemovesConnectChoice() throws Exception {
2641b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
2642b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
2643b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
2644b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
2645b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
2646b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
2647b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2648b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Set connect choice of network 2 over network 1.
2649b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(
2650b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                mWifiConfigManager.setNetworkConnectChoice(
2651b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                        network1.networkId, network2.configKey(), 78L));
2652b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2653b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration retrievedNetwork =
2654b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2655b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertEquals(
2656b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2657b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2658b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2659b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Remove network 3 and ensure that the connect choice on network 1 is not removed.
2660b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(mWifiConfigManager.removeNetwork(network3.networkId, TEST_CREATOR_UID));
2661b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2662b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertEquals(
2663b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2664b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2665b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2666b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Now remove network 2 and ensure that the connect choice on network 1 is removed..
2667b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(mWifiConfigManager.removeNetwork(network2.networkId, TEST_CREATOR_UID));
2668b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2669b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertNotEquals(
2670b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2671b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2672cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius
2673cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        // This should have triggered 2 buffered writes. 1 for setting the connect choice, 1 for
2674cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        // clearing it after network removal.
26750a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, times(2)).write(eq(false));
2676b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    }
2677b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
26780f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    /**
26790f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * Verifies that the modification of a single network using
26800f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and ensures that any
26810f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * updates to the network config in
26820f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * {@link WifiKeyStore#updateNetworkKeys(WifiConfiguration, WifiConfiguration)} is reflected
26830f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * in the internal database.
26840f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     */
26850f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    @Test
26860f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    public void testUpdateSingleNetworkWithKeysUpdate() {
26870f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
26880f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        network.enterpriseConfig =
26890f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
26900f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
26910f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
26920f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Now verify that network configurations match before we make any change.
26930f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
26940f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                network,
26950f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
26960f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
26970f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Modify the network ca_cert field in updateNetworkKeys method during a network
26980f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // config update.
26990f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        final String newCaCertAlias = "test";
27000f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        assertNotEquals(newCaCertAlias, network.enterpriseConfig.getCaCertificateAlias());
27010f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
27020f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        doAnswer(new AnswerWithArguments() {
27030f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius            public boolean answer(WifiConfiguration newConfig, WifiConfiguration existingConfig) {
27040f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                newConfig.enterpriseConfig.setCaCertificateAlias(newCaCertAlias);
27050f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                return true;
27060f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius            }
27070f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        }).when(mWifiKeyStore).updateNetworkKeys(
27080f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                any(WifiConfiguration.class), any(WifiConfiguration.class));
27090f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
27100f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
27110f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
27120f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Now verify that the keys update is reflected in the configuration fetched from internal
27130f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // db.
27140f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        network.enterpriseConfig.setCaCertificateAlias(newCaCertAlias);
27150f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
27160f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                network,
27170f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
27180f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    }
27190f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
272042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    /**
272142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     * Verifies that the dump method prints out all the saved network details with passwords masked.
272242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     * {@link WifiConfigManager#dump(FileDescriptor, PrintWriter, String[])}.
272342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     */
272442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    @Test
272542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    public void testDump() {
272642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
272742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
272842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        eapNetwork.enterpriseConfig.setPassword("blah");
272942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
273042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
273142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        verifyAddNetworkToWifiConfigManager(eapNetwork);
273242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
273342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        StringWriter stringWriter = new StringWriter();
273442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        mWifiConfigManager.dump(
273542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius                new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
273642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        String dumpString = stringWriter.toString();
273742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
273842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        // Ensure that the network SSIDs were dumped out.
273942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertTrue(dumpString.contains(pskNetwork.SSID));
274042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertTrue(dumpString.contains(eapNetwork.SSID));
274142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
274242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        // Ensure that the network passwords were not dumped out.
274342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertFalse(dumpString.contains(pskNetwork.preSharedKey));
274442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertFalse(dumpString.contains(eapNetwork.enterpriseConfig.getPassword()));
274542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    }
274642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
27475c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    /**
27485c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     * Verifies the ordering of network list generated using
27495c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     * {@link WifiConfigManager#retrieveHiddenNetworkList()}.
27505c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     */
27515c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    @Test
27525c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    public void testRetrieveHiddenList() {
27535c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Create and add 3 networks.
27545c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createWepHiddenNetwork();
27555c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskHiddenNetwork();
27565c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
27575c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
27585c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
27595c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
27605c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27615c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Enable all of them.
27625c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network1.networkId, false, TEST_CREATOR_UID));
27635c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network2.networkId, false, TEST_CREATOR_UID));
27645c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network3.networkId, false, TEST_CREATOR_UID));
27655c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27665c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now set scan results in 2 of them to set the corresponding
27675c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
27685c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
27695c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
27705c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
27715c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
27725c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27735c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now increment |network3|'s association count. This should ensure that this network
27745c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // is preferred over |network1|.
27755c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
27765c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27775c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Retrieve the hidden network list & verify the order of the networks returned.
27785c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        List<WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks =
27795c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                mWifiConfigManager.retrieveHiddenNetworkList();
27805c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(3, hiddenNetworks.size());
27815c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network3.SSID, hiddenNetworks.get(0).ssid);
27825c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network1.SSID, hiddenNetworks.get(1).ssid);
27835c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network2.SSID, hiddenNetworks.get(2).ssid);
27845c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27855c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now permanently disable |network3|. This should remove network 3 from the list.
27865c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.disableNetwork(network3.networkId, TEST_CREATOR_UID));
27875c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27885c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Retrieve the hidden network list again & verify the order of the networks returned.
27895c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        hiddenNetworks = mWifiConfigManager.retrieveHiddenNetworkList();
27905c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(2, hiddenNetworks.size());
27915c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network1.SSID, hiddenNetworks.get(0).ssid);
27925c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network2.SSID, hiddenNetworks.get(1).ssid);
27935c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    }
27945c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
27955c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    /**
27965c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * Verifies the addition of network configurations using
27975c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with same SSID and
27985c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * default key mgmt does not add duplicate network configs.
27995c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     */
28005c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    @Test
28015c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    public void testAddMultipleNetworksWithSameSSIDAndDefaultKeyMgmt() {
28025c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        final String ssid = "test_blah";
28035c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Add a network with the above SSID and default key mgmt and ensure it was added
28045c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // successfully.
28055c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network1 = new WifiConfiguration();
28065c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.SSID = ssid;
28075c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network1);
28085c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
28095c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
28105c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28115c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> retrievedNetworks =
28125c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
28135c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
28145c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
28155c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network1, retrievedNetworks.get(0));
28165c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28175c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Now add a second network with the same SSID and default key mgmt and ensure that it
28185c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // didn't add a new duplicate network.
28195c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network2 = new WifiConfiguration();
28205c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.SSID = ssid;
28215c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        result = addNetworkToWifiConfigManager(network2);
28225c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
28235c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertFalse(result.isNewNetwork());
28245c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28255c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
28265c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
28275c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
28285c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network2, retrievedNetworks.get(0));
28295c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    }
28305c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28315c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    /**
28325c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * Verifies the addition of network configurations using
28335c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with same SSID and
28345c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * different key mgmt should add different network configs.
28355c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     */
28365c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    @Test
28375c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    public void testAddMultipleNetworksWithSameSSIDAndDifferentKeyMgmt() {
28385c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        final String ssid = "test_blah";
28395c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Add a network with the above SSID and WPA_PSK key mgmt and ensure it was added
28405c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // successfully.
28415c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network1 = new WifiConfiguration();
28425c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.SSID = ssid;
28435c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
28445c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network1);
28455c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
28465c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
28475c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28485c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> retrievedNetworks =
28495c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
28505c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
28515c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
28525c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network1, retrievedNetworks.get(0));
28535c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28545c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Now add a second network with the same SSID and NONE key mgmt and ensure that it
28555c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // does add a new network.
28565c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network2 = new WifiConfiguration();
28575c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.SSID = ssid;
28585c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
28595c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        result = addNetworkToWifiConfigManager(network2);
28605c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
28615c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
28625c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28635c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
28645c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(2, retrievedNetworks.size());
28655c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> networks = Arrays.asList(network1, network2);
28665c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
28675c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                networks, retrievedNetworks);
28685c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    }
28695c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
28700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
28710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a proxy, without having permission OVERRIDE_WIFI_CONFIG,
28720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * holding device policy, or profile owner policy fails.
28730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
28740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
28750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyFails() {
28760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
28810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
28820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
28880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
28890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
28910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
28920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
28930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a PAC or STATIC proxy with permission
28940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * OVERRIDE_WIFI_CONFIG is successful
28950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
28960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
28970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyWithConfOverride() {
28980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true,  // withConfOverride
29000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
29030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true,  // withConfOverride
29070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
29100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
29130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
29140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
29150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a PAC or STATIC proxy, while holding policy
29160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER} is successful
29170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
29180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
29190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyAsProfileOwner() {
29200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
29220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
29230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
29250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
29290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
29300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
29320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
29350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
29360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a PAC or STATIC proxy, while holding policy
29370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER} is successful
29380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
29390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
29400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyAsDeviceOwner() {
29410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
29430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
29450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
29460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
29500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
29520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
29530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
29560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
29570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network (that has no proxy) and adding a PAC or STATIC proxy fails
29580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * without being able to override configs, or holding Device or Profile owner policies.
29590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
29600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
29610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkAddProxyFails() {
29620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        WifiConfiguration network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
29630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network);
29640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
29690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
29700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
29710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
29760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
29770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
29780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
29790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
29800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network and adding a proxy is successful in the cases where app can
29810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * override configs, holds policy {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER},
29820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * and holds policy {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER}, and that it fails
29830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * otherwise.
29840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
29850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
29860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkAddProxyWithPermissionAndSystem() {
29870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Testing updating network with uid permission OVERRIDE_WIFI_CONFIG
29880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        WifiConfiguration network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
2989dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network, TEST_CREATOR_UID);
29900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
29910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
29930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
29960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
29980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
29990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Testing updating network with proxy while holding Profile Owner policy
30000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
3001dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        result = addNetworkToWifiConfigManager(network, TEST_NO_PERM_UID);
30020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
30030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
30050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
30060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
30070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
30080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
30090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
30100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
30110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Testing updating network with proxy while holding Device Owner Policy
30120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
3013dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        result = addNetworkToWifiConfigManager(network, TEST_NO_PERM_UID);
30140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
30150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
30170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
30180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
30190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
30200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
30210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
30220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
30230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
30240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
30250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network that has a proxy without changing the proxy, can succeed
30260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * without proxy specific permissions.
30270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
30280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
30290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkUnchangedProxy() {
30300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf = WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy();
30310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // First create a WifiConfiguration with proxy
30320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withConfOverride
30340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        true, // withProfileOwnerPolicy
30350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withDeviceOwnerPolicy
30360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        ipConf,
30370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        true, // assertSuccess
30380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
30390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update the network while using the same ipConf, and no proxy specific permissions
30400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withConfOverride
30420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withProfileOwnerPolicy
30430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withDeviceOwnerPolicy
30440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        ipConf,
30450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        true, // assertSuccess
30460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        result.getNetworkId()); // Update networkID
30470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
30480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
30490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
30500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network with a different proxy succeeds in the cases where app can
30510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * override configs, holds policy {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER},
30520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * and holds policy {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER}, and that it fails
30530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * otherwise.
30540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
30550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
30560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkDifferentProxy() {
30570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Create two proxy configurations of the same type, but different values
30580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf1 =
30590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
30600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.STATIC_PROXY_SETTING,
30610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_1,
30620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_1,
30630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_1,
30640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_1);
30650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf2 =
30660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
30670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.STATIC_PROXY_SETTING,
30680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_2,
30690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_2,
30700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_2,
30710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_2);
30720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
30730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with Conf Override
30740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
30760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
30770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
30780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
30790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
30800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
30810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
30830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
30840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
30850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
30860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
30870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
30880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
30890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Device Owner
30900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
30920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
30930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
30940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
30950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
30960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
30970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
30980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
30990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
31000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
31010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
31020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
31040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
31050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Profile Owner
31060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
31090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
31110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
31130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
31160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
31180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
31200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
31210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with no permissions (should fail)
31220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
31250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
31270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
31290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
31320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
31340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
31350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
31360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
31370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
31380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network removing its proxy succeeds in the cases where app can
31390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * override configs, holds policy {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER},
31400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * and holds policy {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER}, and that it fails
31410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * otherwise.
31420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
31430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
31440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkRemoveProxy() {
31450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Create two different IP configurations, one with a proxy and another without.
31460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf1 =
31470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
31480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.STATIC_PROXY_SETTING,
31490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_1,
31500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_1,
31510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_1,
31520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_1);
31530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf2 =
31540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
31550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.NONE_PROXY_SETTING,
31560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_2,
31570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_2,
31580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_2,
31590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_2);
31600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
31610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with Conf Override
31620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
31640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
31650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
31670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
31690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
31710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
31720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
31740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
31760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
31770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Device Owner
31780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
31810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
31820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
31830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
31850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
31880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
31890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
31900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
31910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
31920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
31930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Profile Owner
31940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
31950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
31960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
31970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
31980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
31990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
32000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
32010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
32020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
32030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
32040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
32050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
32060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
32070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
32080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
32090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with no permissions (should fail)
32100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
32110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
32120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
32130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
32140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
32150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
32160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
32170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
32180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
32190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
32200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
32210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
32220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
32230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
32240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
32250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
3226a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan    /**
3227a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan     * Verifies that the app specified BSSID is converted and saved in lower case.
3228a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan     */
3229a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan    @Test
3230a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan    public void testAppSpecifiedBssidIsSavedInLowerCase() {
3231a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        final String bssid = "0A:08:5C:BB:89:6D"; // upper case
3232a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
3233a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        openNetwork.BSSID = bssid;
3234a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan
3235a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
3236a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan
3237a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(
3238a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan                result.getNetworkId());
3239a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan
3240a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        assertNotEquals(retrievedNetwork.BSSID, bssid);
3241a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan        assertEquals(retrievedNetwork.BSSID, bssid.toLowerCase());
3242a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan    }
3243a8bea9aed9c0e8a16e51568541b90f0900edb9efRandy Pan
32440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private NetworkUpdateResult verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
32450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean withConfOverride,
32460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean withProfileOwnerPolicy,
32470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean withDeviceOwnerPolicy,
32480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            IpConfiguration ipConfiguration,
32490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean assertSuccess,
32500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            int networkId) {
32510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        WifiConfiguration network;
32520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        if (networkId == WifiConfiguration.INVALID_NETWORK_ID) {
32530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
32540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        } else {
32550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            network = mWifiConfigManager.getConfiguredNetwork(networkId);
32560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        }
32570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        network.setIpConfiguration(ipConfiguration);
32580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
32590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_PROFILE_OWNER)))
32600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(withProfileOwnerPolicy);
32610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
32620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_DEVICE_OWNER)))
32630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(withDeviceOwnerPolicy);
3264835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein        when(mWifiPermissionsUtil.checkConfigOverridePermission(anyInt()))
3265835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein                .thenReturn(withConfOverride);
32660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        int uid = withConfOverride ? TEST_CREATOR_UID : TEST_NO_PERM_UID;
3267dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network, uid);
32680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertEquals(assertSuccess, result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
32690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        return result;
32700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
32710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
32722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private void createWifiConfigManager() {
32732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mWifiConfigManager =
3274a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                new WifiConfigManager(
3275835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein                        mContext, mClock, mUserManager, mTelephonyManager,
32760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        mWifiKeyStore, mWifiConfigStore, mWifiConfigStoreLegacy,
3277835e781643b79c30fabbab5595770cf01b5861fbRebecca Silberstein                        mWifiPermissionsUtil, mWifiPermissionsWrapper, mNetworkListStoreData,
32780a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                        mDeletedEphemeralSsidsStoreData);
32792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mWifiConfigManager.enableVerboseLogging(1);
32802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
32812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
32828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
328350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * This method sets defaults in the provided WifiConfiguration object if not set
328450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * so that it can be used for comparison with the configuration retrieved from
328550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * WifiConfigManager.
328650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
328750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setDefaults(WifiConfiguration configuration) {
328850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedAuthAlgorithms.isEmpty()) {
328950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
329050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
329150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedProtocols.isEmpty()) {
329250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
329350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
329450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
329550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedKeyManagement.isEmpty()) {
329650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
329750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
329850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
329950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedPairwiseCiphers.isEmpty()) {
330050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
330150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
330250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
330350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedGroupCiphers.isEmpty()) {
330450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
330550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
330650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
330750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
330850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
330950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.getIpAssignment() == IpConfiguration.IpAssignment.UNASSIGNED) {
331050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
331150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
331250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.getProxySettings() == IpConfiguration.ProxySettings.UNASSIGNED) {
331350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.setProxySettings(IpConfiguration.ProxySettings.NONE);
331450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
33150ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        configuration.status = WifiConfiguration.Status.DISABLED;
33160ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        configuration.getNetworkSelectionStatus().setNetworkSelectionStatus(
33170ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius                NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
331850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
331950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
332050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
332150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided configuration with creator uid, package name
332250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * and time.
332350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
332450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setCreationDebugParams(WifiConfiguration configuration) {
332550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creatorUid = configuration.lastUpdateUid = TEST_CREATOR_UID;
332650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creatorName = configuration.lastUpdateName = TEST_CREATOR_NAME;
332750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creationTime = configuration.updateTime =
3328a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.createDebugTimeStampString(
332950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                        TEST_WALLCLOCK_CREATION_TIME_MILLIS);
333050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
333150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
333250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
333350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided configuration with update uid, package name
333450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * and time.
333550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
333650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setUpdateDebugParams(WifiConfiguration configuration) {
333750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.lastUpdateUid = TEST_UPDATE_UID;
333850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.lastUpdateName = TEST_UPDATE_NAME;
333950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.updateTime =
3340a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.createDebugTimeStampString(TEST_WALLCLOCK_UPDATE_TIME_MILLIS);
334150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
334250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
33431fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertNotEquals(Object expected, Object actual) {
33441fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        if (actual != null) {
33451fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            assertFalse(actual.equals(expected));
33461fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        } else {
33471fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            assertNotNull(expected);
33481fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        }
33491fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
33501fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
335150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
335250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided WifiConfiguration with the specified bssid value. Also, asserts that
335350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * the existing |BSSID| field is not the same value as the one being set
335450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
335550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void assertAndSetNetworkBSSID(WifiConfiguration configuration, String bssid) {
33561fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(bssid, configuration.BSSID);
335750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.BSSID = bssid;
335850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
335950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
336050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
336150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided WifiConfiguration with the specified |IpConfiguration| object. Also,
33621fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * asserts that the existing |mIpConfiguration| field is not the same value as the one being set
336350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
336450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void assertAndSetNetworkIpConfiguration(
336550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            WifiConfiguration configuration, IpConfiguration ipConfiguration) {
33661fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(ipConfiguration, configuration.getIpConfiguration());
336750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.setIpConfiguration(ipConfiguration);
336850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
336950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
337050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
33711fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified |wepKeys| value and
33721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * |wepTxKeyIndex|.
33731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
33741fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkWepKeysAndTxIndex(
33751fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String[] wepKeys, int wepTxKeyIdx) {
33761fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(wepKeys, configuration.wepKeys);
33771fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(wepTxKeyIdx, configuration.wepTxKeyIndex);
33781fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.wepKeys = Arrays.copyOf(wepKeys, wepKeys.length);
33791fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.wepTxKeyIndex = wepTxKeyIdx;
33801fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
33811fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
33821fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
33831fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified |preSharedKey| value.
33841fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
33851fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkPreSharedKey(
33861fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String preSharedKey) {
33871fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(preSharedKey, configuration.preSharedKey);
33881fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.preSharedKey = preSharedKey;
33891fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
33901fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
33911fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
33921fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified enteprise |password| value.
33931fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
33941fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkEnterprisePassword(
33951fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String password) {
33961fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(password, configuration.enterpriseConfig.getPassword());
33971fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.enterpriseConfig.setPassword(password);
33981fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
33991fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
34001fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
34010a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     * Helper method to capture the networks list store data that will be written by
34020a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     * WifiConfigStore.write() method.
34036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
34040a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    private Pair<List<WifiConfiguration>, List<WifiConfiguration>>
34050a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            captureWriteNetworksListStoreData() {
34066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        try {
34070a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            ArgumentCaptor<ArrayList> sharedConfigsCaptor =
34080a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                    ArgumentCaptor.forClass(ArrayList.class);
34090a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            ArgumentCaptor<ArrayList> userConfigsCaptor =
34100a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                    ArgumentCaptor.forClass(ArrayList.class);
34110a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            mNetworkListStoreDataMockOrder.verify(mNetworkListStoreData)
34120a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                    .setSharedConfigurations(sharedConfigsCaptor.capture());
34130a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            mNetworkListStoreDataMockOrder.verify(mNetworkListStoreData)
34140a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                    .setUserConfigurations(userConfigsCaptor.capture());
34150a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(anyBoolean());
34160a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            return Pair.create(sharedConfigsCaptor.getValue(), userConfigsCaptor.getValue());
34176e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        } catch (Exception e) {
34186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            fail("Exception encountered during write " + e);
34196e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
3420c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        return null;
3421c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
3422c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
3423c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
3424c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Returns whether the provided network was in the store data or not.
3425c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
3426c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private boolean isNetworkInConfigStoreData(WifiConfiguration configuration) {
34270a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        Pair<List<WifiConfiguration>, List<WifiConfiguration>> networkListStoreData =
34280a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                captureWriteNetworksListStoreData();
34290a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        if (networkListStoreData == null) {
3430c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            return false;
3431c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        }
34320a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        List<WifiConfiguration> networkList = new ArrayList<>();
34330a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        networkList.addAll(networkListStoreData.first);
34340a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        networkList.addAll(networkListStoreData.second);
34350a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        return isNetworkInConfigStoreData(configuration, networkList);
3436bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
3437bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
3438bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
3439bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Returns whether the provided network was in the store data or not.
3440bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
3441bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    private boolean isNetworkInConfigStoreData(
34420a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            WifiConfiguration configuration, List<WifiConfiguration> networkList) {
3443c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        boolean foundNetworkInStoreData = false;
34440a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        for (WifiConfiguration retrievedConfig : networkList) {
3445c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            if (retrievedConfig.configKey().equals(configuration.configKey())) {
3446c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                foundNetworkInStoreData = true;
3447bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius                break;
3448c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
3449c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        }
3450c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        return foundNetworkInStoreData;
34516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
34526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
34536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
34540a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     * Setup expectations for WifiNetworksListStoreData and DeletedEphemeralSsidsStoreData
34550a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     * after WifiConfigStore#read.
34560a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     */
34570a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    private void setupStoreDataForRead(List<WifiConfiguration> sharedConfigurations,
34580a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            List<WifiConfiguration> userConfigurations, Set<String> deletedEphemeralSsids) {
34590a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        when(mNetworkListStoreData.getSharedConfigurations())
34600a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu                .thenReturn(sharedConfigurations);
34610a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        when(mNetworkListStoreData.getUserConfigurations()).thenReturn(userConfigurations);
34620a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        when(mDeletedEphemeralSsidsStoreData.getSsidList()).thenReturn(deletedEphemeralSsids);
34630a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    }
34640a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu
34650a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    /**
34660a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     * Setup expectations for WifiNetworksListStoreData and DeletedEphemeralSsidsStoreData
34670a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     * after WifiConfigStore#switchUserStoreAndRead.
34680a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu     */
34690a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    private void setupStoreDataForUserRead(List<WifiConfiguration> userConfigurations,
34700a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu            Set<String> deletedEphemeralSsids) {
34710a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        when(mNetworkListStoreData.getUserConfigurations()).thenReturn(userConfigurations);
34720a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        when(mDeletedEphemeralSsidsStoreData.getSsidList()).thenReturn(deletedEphemeralSsids);
34730a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    }
34740a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu
34750a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu    /**
34766e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the provided network was not present in the last config store write.
34776e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
34786e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkNotInConfigStoreData(WifiConfiguration configuration) {
34796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(isNetworkInConfigStoreData(configuration));
34806e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
34816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
34826e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
34836e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the provided network was present in the last config store write.
34846e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
34856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkInConfigStoreData(WifiConfiguration configuration) {
34866e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(isNetworkInConfigStoreData(configuration));
34876e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
34886e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
34896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void assertPasswordsMaskedInWifiConfiguration(WifiConfiguration configuration) {
349022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (!TextUtils.isEmpty(configuration.preSharedKey)) {
3491a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius            assertEquals(WifiConfigManager.PASSWORD_MASK, configuration.preSharedKey);
34926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
34936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        if (configuration.wepKeys != null) {
34946e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            for (int i = 0; i < configuration.wepKeys.length; i++) {
34956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                if (!TextUtils.isEmpty(configuration.wepKeys[i])) {
3496a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    assertEquals(WifiConfigManager.PASSWORD_MASK, configuration.wepKeys[i]);
34976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                }
34986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            }
34996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
350022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (!TextUtils.isEmpty(configuration.enterpriseConfig.getPassword())) {
35016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            assertEquals(
3502a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    WifiConfigManager.PASSWORD_MASK,
35036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    configuration.enterpriseConfig.getPassword());
35046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
35056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
35066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35076e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
35086e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the network was present in the network change broadcast and returns the
35096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * change reason.
35106e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
35116e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private int verifyNetworkInBroadcastAndReturnReason(WifiConfiguration configuration) {
35126e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
35136e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        ArgumentCaptor<UserHandle> userHandleCaptor = ArgumentCaptor.forClass(UserHandle.class);
35146e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        mContextConfigStoreMockOrder.verify(mContext)
35156e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                .sendBroadcastAsUser(intentCaptor.capture(), userHandleCaptor.capture());
35166e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35176e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(userHandleCaptor.getValue(), UserHandle.ALL);
35186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        Intent intent = intentCaptor.getValue();
35196e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        int changeReason = intent.getIntExtra(WifiManager.EXTRA_CHANGE_REASON, -1);
35216e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        WifiConfiguration retrievedConfig =
35226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                (WifiConfiguration) intent.getExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
35236e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(retrievedConfig.configKey(), configuration.configKey());
35246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35256e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that all the passwords are masked in the broadcast configuration.
35266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedConfig);
35276e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35286e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return changeReason;
35296e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
35306e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35316e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
35326e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out an add broadcast with the provided network.
35336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
35346e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkAddBroadcast(WifiConfiguration configuration) {
35356e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
35366e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
35376e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_ADDED);
35386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
35396e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
35416e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out an update broadcast with the provided network.
35426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
35436e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkUpdateBroadcast(WifiConfiguration configuration) {
35446e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
35456e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
35466e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_CONFIG_CHANGE);
35476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
35486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
35506e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out a remove broadcast with the provided network.
35516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
35526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkRemoveBroadcast(WifiConfiguration configuration) {
35536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
35546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
35556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_REMOVED);
35566e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
35576e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
3558dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    private void verifyWifiConfigStoreRead() {
3559dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
3560dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        mContextConfigStoreMockOrder.verify(mContext)
3561dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius                .sendBroadcastAsUser(any(Intent.class), any(UserHandle.class));
3562dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    }
3563dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius
3564dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    private void triggerStoreReadIfNeeded() {
3565dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        // Trigger a store read if not already done.
3566dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        if (!mStoreReadTriggered) {
3567dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius            verifyWifiConfigStoreRead();
3568dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius            mStoreReadTriggered = true;
3569dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        }
3570dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    }
3571dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius
3572dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    /**
3573dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     * Adds the provided configuration to WifiConfigManager with uid = TEST_CREATOR_UID.
3574dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     */
3575dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration) {
3576dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        return addNetworkToWifiConfigManager(configuration, TEST_CREATOR_UID);
3577dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    }
3578dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius
35796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
358050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Adds the provided configuration to WifiConfigManager and modifies the provided configuration
358150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * with creator/update uid, package name and time. This also sets defaults for fields not
358250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * populated.
358350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * These fields are populated internally by WifiConfigManager and hence we need
358450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * to modify the configuration before we compare the added network with the retrieved network.
3585dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius     * This method also triggers a store read if not already done.
358650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
3587dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius    private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration,
3588dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius                                                              int uid) {
3589dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius        triggerStoreReadIfNeeded();
359050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_CREATION_TIME_MILLIS);
359150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        NetworkUpdateResult result =
3592dc5eab67d9ca3e0453318071746e76b5d16990d6Roshan Pius                mWifiConfigManager.addOrUpdateNetwork(configuration, uid);
359350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setDefaults(configuration);
359450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setCreationDebugParams(configuration);
35956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        configuration.networkId = result.getNetworkId();
35966e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
35976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
35986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
35996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
36006e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Add network to WifiConfigManager and ensure that it was successful.
36016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
36026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyAddNetworkToWifiConfigManager(
36036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
36046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
36056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
36066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.isNewNetwork());
36076e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
36086e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
36096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36106e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkAddBroadcast(configuration);
36116e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that the config store write was triggered with this new configuration.
36126e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkInConfigStoreData(configuration);
36136e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
36146e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
36156e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36166e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
36176e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Add ephemeral network to WifiConfigManager and ensure that it was successful.
36186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
36196e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyAddEphemeralNetworkToWifiConfigManager(
3620bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius            WifiConfiguration configuration) throws Exception {
36216e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
36226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
36236e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.isNewNetwork());
36246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
36256e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
36266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36276e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkAddBroadcast(configuration);
3628bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that the write was not invoked for ephemeral network addition.
36290a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
363050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        return result;
363150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
363250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
363350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
3634d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     * Add Passpoint network to WifiConfigManager and ensure that it was successful.
3635d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     */
3636d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    private NetworkUpdateResult verifyAddPasspointNetworkToWifiConfigManager(
3637d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu            WifiConfiguration configuration) throws Exception {
3638d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
3639d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
3640d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertTrue(result.isNewNetwork());
3641d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertTrue(result.hasIpChanged());
3642d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertTrue(result.hasProxyChanged());
3643d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
3644d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        // Verify keys are not being installed.
3645d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        verify(mWifiKeyStore, never()).updateNetworkKeys(any(WifiConfiguration.class),
3646d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu                any(WifiConfiguration.class));
3647d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        verifyNetworkAddBroadcast(configuration);
3648d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        // Ensure that the write was not invoked for Passpoint network addition.
36490a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
3650d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        return result;
3651d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    }
3652d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
3653d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    /**
365450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Updates the provided configuration to WifiConfigManager and modifies the provided
365550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * configuration with update uid, package name and time.
365650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * These fields are populated internally by WifiConfigManager and hence we need
365750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * to modify the configuration before we compare the added network with the retrieved network.
365850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
365950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private NetworkUpdateResult updateNetworkToWifiConfigManager(WifiConfiguration configuration) {
366050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_UPDATE_TIME_MILLIS);
366150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        NetworkUpdateResult result =
366250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(configuration, TEST_UPDATE_UID);
366350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setUpdateDebugParams(configuration);
366450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        return result;
366550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
36666e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36676e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
36686e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager config change and ensure that it was successful.
36696e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
36706e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManager(
36716e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
36726e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = updateNetworkToWifiConfigManager(configuration);
36736e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
36746e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.isNewNetwork());
36756e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36766e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkUpdateBroadcast(configuration);
36776e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that the config store write was triggered with this new configuration.
36786e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkInConfigStoreData(configuration);
36796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
36806e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
36816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36826e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
36836e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager without IP config change and ensure that it was
36846e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * successful.
36856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
36866e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(
36876e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
36886e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManager(configuration);
36896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.hasIpChanged());
36906e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.hasProxyChanged());
36916e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
36926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
36936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
36946e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
36956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager with IP config change and ensure that it was
36966e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * successful.
36976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
36986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManagerWithIpChange(
36996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
37006e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManager(configuration);
37016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
37026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
37036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
37046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
3705c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
3706c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
3707c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * Removes network from WifiConfigManager and ensure that it was successful.
3708c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
3709c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    private void verifyRemoveNetworkFromWifiConfigManager(
3710c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius            WifiConfiguration configuration) {
37116d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID));
3712c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
3713c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyNetworkRemoveBroadcast(configuration);
3714c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Verify if the config store write was triggered without this new configuration.
3715c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyNetworkNotInConfigStoreData(configuration);
3716c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
3717fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3718fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
3719bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Removes ephemeral network from WifiConfigManager and ensure that it was successful.
3720bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
3721bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    private void verifyRemoveEphemeralNetworkFromWifiConfigManager(
37222ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            WifiConfiguration configuration) throws Exception {
3723bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID));
3724bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
3725bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyNetworkRemoveBroadcast(configuration);
3726bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that the write was not invoked for ephemeral network remove.
37270a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
3728bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
3729bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
3730bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
3731d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     * Removes Passpoint network from WifiConfigManager and ensure that it was successful.
3732d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu     */
3733d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    private void verifyRemovePasspointNetworkFromWifiConfigManager(
3734d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu            WifiConfiguration configuration) throws Exception {
3735d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID));
3736d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
3737d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        // Verify keys are not being removed.
3738d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        verify(mWifiKeyStore, never()).removeKeys(any(WifiEnterpriseConfig.class));
3739d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        verifyNetworkRemoveBroadcast(configuration);
3740d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu        // Ensure that the write was not invoked for Passpoint network remove.
37410a0b5035ce8013ed327a0802357a1b7df3061912Peter Qiu        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never()).write(anyBoolean());
3742d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    }
3743d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu
3744d7e8058288bdc5085b54fef77dbfa38597cea348Peter Qiu    /**
3745fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the provided network's public status and ensures that the network change broadcast
3746fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * has been sent out.
3747fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
3748fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private void verifyUpdateNetworkStatus(WifiConfiguration configuration, int status) {
3749fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertEquals(status, configuration.status);
3750fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyNetworkUpdateBroadcast(configuration);
3751fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
3752fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3753fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
3754fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the network's selection status update.
3755fc789b2227e92372b2489ca54691310800835a50Roshan Pius     *
3756fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * For temporarily disabled reasons, the method ensures that the status has changed only if
3757fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * disable reason counter has exceeded the threshold.
3758fc789b2227e92372b2489ca54691310800835a50Roshan Pius     *
3759fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * For permanently disabled/enabled reasons, the method ensures that the public status has
3760fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * changed and the network change broadcast has been sent out.
3761fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
3762fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private void verifyUpdateNetworkSelectionStatus(
3763fc789b2227e92372b2489ca54691310800835a50Roshan Pius            int networkId, int reason, int temporaryDisableReasonCounter) {
3764fc789b2227e92372b2489ca54691310800835a50Roshan Pius        when(mClock.getElapsedSinceBootMillis())
3765fc789b2227e92372b2489ca54691310800835a50Roshan Pius                .thenReturn(TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS);
3766fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3767fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Fetch the current status of the network before we try to update the status.
3768fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
3769fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus currentStatus = retrievedNetwork.getNetworkSelectionStatus();
3770fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int currentDisableReason = currentStatus.getNetworkSelectionDisableReason();
3771fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3772fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set the status to the provided reason.
3773fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkSelectionStatus(networkId, reason));
3774fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3775fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now fetch the network configuration and verify the new status of the network.
3776fc789b2227e92372b2489ca54691310800835a50Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
3777fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3778fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
3779fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int retrievedDisableReason = retrievedStatus.getNetworkSelectionDisableReason();
3780fc789b2227e92372b2489ca54691310800835a50Roshan Pius        long retrievedDisableTime = retrievedStatus.getDisableTime();
3781fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int retrievedDisableReasonCounter = retrievedStatus.getDisableReasonCounter(reason);
3782fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int disableReasonThreshold =
3783a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[reason];
3784fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3785fc789b2227e92372b2489ca54691310800835a50Roshan Pius        if (reason == NetworkSelectionStatus.NETWORK_SELECTION_ENABLE) {
3786fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(reason, retrievedDisableReason);
3787fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertTrue(retrievedStatus.isNetworkEnabled());
3788fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(
3789fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    NetworkSelectionStatus.INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP,
3790fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    retrievedDisableTime);
3791fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
3792fc789b2227e92372b2489ca54691310800835a50Roshan Pius        } else if (reason < NetworkSelectionStatus.DISABLED_TLS_VERSION_MISMATCH) {
3793fc789b2227e92372b2489ca54691310800835a50Roshan Pius            // For temporarily disabled networks, we need to ensure that the current status remains
3794fc789b2227e92372b2489ca54691310800835a50Roshan Pius            // until the threshold is crossed.
3795fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(temporaryDisableReasonCounter, retrievedDisableReasonCounter);
3796fc789b2227e92372b2489ca54691310800835a50Roshan Pius            if (retrievedDisableReasonCounter < disableReasonThreshold) {
3797fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(currentDisableReason, retrievedDisableReason);
3798fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(
3799fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        currentStatus.getNetworkSelectionStatus(),
3800fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        retrievedStatus.getNetworkSelectionStatus());
3801fc789b2227e92372b2489ca54691310800835a50Roshan Pius            } else {
3802fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(reason, retrievedDisableReason);
3803fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertTrue(retrievedStatus.isNetworkTemporaryDisabled());
3804fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(
3805fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS, retrievedDisableTime);
3806fc789b2227e92372b2489ca54691310800835a50Roshan Pius            }
3807fc789b2227e92372b2489ca54691310800835a50Roshan Pius        } else if (reason < NetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX) {
3808fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(reason, retrievedDisableReason);
3809fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertTrue(retrievedStatus.isNetworkPermanentlyDisabled());
3810fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(
3811fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    NetworkSelectionStatus.INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP,
3812fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    retrievedDisableTime);
3813fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.DISABLED);
3814fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
3815fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
3816fc789b2227e92372b2489ca54691310800835a50Roshan Pius
381722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
38182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Creates a scan detail corresponding to the provided network and given BSSID, level &frequency
38192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * values.
382022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
38212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private ScanDetail createScanDetailForNetwork(
38222dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            WifiConfiguration configuration, String bssid, int level, int frequency) {
382322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        String caps;
382422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
382522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WPA2-PSK-CCMP]";
382622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)
382722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                || configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X)) {
382822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WPA2-EAP-CCMP]";
382922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)
383022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                && WifiConfigurationUtil.hasAnyValidWepKey(configuration.wepKeys)) {
383122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WEP]";
383222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else {
383322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[]";
383422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        }
383522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiSsid ssid = WifiSsid.createFromAsciiEncoded(configuration.getPrintableSsid());
383622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Fill in 0's in the fields we don't care about.
383722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        return new ScanDetail(
38382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                ssid, bssid, caps, level, frequency, mClock.getUptimeSinceBootMillis(),
38392dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mClock.getWallClockMillis());
38402dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
38412dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
38422dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
38432dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Creates a scan detail corresponding to the provided network and BSSID value.
38442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
38452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration, String bssid) {
38462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        return createScanDetailForNetwork(configuration, bssid, 0, 0);
384722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
384822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
384922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
385022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Creates a scan detail corresponding to the provided network and fixed BSSID value.
385122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
385222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration) {
385322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        return createScanDetailForNetwork(configuration, TEST_BSSID);
385422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
385522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
385622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
385722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Adds the provided network and then creates a scan detail corresponding to the network. The
385822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * method then creates a ScanDetail corresponding to the network and ensures that the network
385922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * is properly matched using
3860a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)} and also
386122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * verifies that the provided scan detail was cached,
386222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
386322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    private void verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
386422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            WifiConfiguration network) {
386522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // First add the provided network.
386622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
386722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
386822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now create a dummy scan detail corresponding to the network.
386922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail scanDetail = createScanDetailForNetwork(network);
387022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanResult scanResult = scanDetail.getScanResult();
387122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
387222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration retrievedNetwork =
387322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail);
3874e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius        // Retrieve the network with password data for comparison.
3875e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius        retrievedNetwork =
3876e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(retrievedNetwork.networkId);
387722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
387822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
387922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                network, retrievedNetwork);
388022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
388122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now retrieve the scan detail cache and ensure that the new scan detail is in cache.
388222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetailCache retrievedScanDetailCache =
388322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                mWifiConfigManager.getScanDetailCacheForNetwork(network.networkId);
388422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertEquals(1, retrievedScanDetailCache.size());
388522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanResult retrievedScanResult = retrievedScanDetailCache.get(scanResult.BSSID);
388622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
388722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanTestUtil.assertScanResultEquals(scanResult, retrievedScanResult);
388822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
38892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
38902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
38912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Adds a new network and verifies that the |HasEverConnected| flag is set to false.
38922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
38932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyAddNetworkHasEverConnectedFalse(WifiConfiguration network) {
38942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network);
38952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
38962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
38972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse("Adding a new network should not have hasEverConnected set to true.",
38982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
38992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
39002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
39012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
39022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Updates an existing network with some credential change and verifies that the
39032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * |HasEverConnected| flag is set to false.
39042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
39052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(
39062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius            WifiConfiguration network) {
39072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
39082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
39092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
39102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse("Updating network credentials config should clear hasEverConnected.",
39112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
3912edf8be948c0879a2153582e853dc048f3060512aRoshan Pius        assertTrue(result.hasCredentialChanged());
39132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
39142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
39152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
39162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Updates an existing network after connection using
3917a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkAfterConnect(int)} and asserts that the
39182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * |HasEverConnected| flag is set to true.
39192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
39202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyUpdateNetworkAfterConnectHasEverConnectedTrue(int networkId) {
39212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(networkId));
39222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
39232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue("hasEverConnected expected to be true after connection.",
39242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
39252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
39262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
3927c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
3928c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Sets up a user profiles for WifiConfigManager testing.
3929c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     *
3930c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * @param userId Id of the user.
3931c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
3932c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private void setupUserProfiles(int userId) {
3933c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final UserInfo userInfo =
3934c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                new UserInfo(userId, Integer.toString(userId), UserInfo.FLAG_PRIMARY);
3935c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<UserInfo> userProfiles = Arrays.asList(userInfo);
3936c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.getProfiles(userId)).thenReturn(userProfiles);
3937c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(userId)).thenReturn(true);
3938c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
3939c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
394050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius}
3941