WifiConfigManagerTest.java revision 0d14dbc1da819e72054b9f168c8e3db767dd34bf
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;
386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.os.UserHandle;
3950eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.os.UserManager;
4096241bee619ff7073635f680a36869f61a11a225Roshan Piusimport android.telephony.TelephonyManager;
4150eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport android.test.suitebuilder.annotation.SmallTest;
426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport android.text.TextUtils;
4350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Piusimport com.android.internal.R;
453a738a26918230b2469d917dbf14323234edd39bRoshan Piusimport com.android.server.wifi.WifiConfigStoreLegacy.WifiConfigStoreDataLegacy;
460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhneimport com.android.server.wifi.util.WifiPermissionsWrapper;
478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
48ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Piusimport org.junit.After;
4950eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.junit.Before;
5050eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.junit.Test;
516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport org.mockito.ArgumentCaptor;
526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Piusimport org.mockito.InOrder;
5350eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.mockito.Mock;
5450eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport org.mockito.MockitoAnnotations;
5550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
5642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.FileDescriptor;
5742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.PrintWriter;
5842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Piusimport java.io.StringWriter;
5950eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport java.util.ArrayList;
601fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Piusimport java.util.Arrays;
612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Piusimport java.util.HashSet;
6250eed92fe9556fdd9934683690181fea77ce4eacRoshan Piusimport java.util.List;
63674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Piusimport java.util.Set;
6450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
6550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius/**
66a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius * Unit tests for {@link com.android.server.wifi.WifiConfigManager}.
6750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius */
6850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius@SmallTest
69a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Piuspublic class WifiConfigManagerTest {
7050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
7150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final String TEST_BSSID = "0a:08:5c:67:89:00";
7250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final long TEST_WALLCLOCK_CREATION_TIME_MILLIS = 9845637;
7350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final long TEST_WALLCLOCK_UPDATE_TIME_MILLIS = 75455637;
74fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private static final long TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS = 29457631;
751fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee    private static final int TEST_CREATOR_UID = WifiConfigurationTestUtil.TEST_UID;
760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final int TEST_NO_PERM_UID = 7;
7750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private static final int TEST_UPDATE_UID = 4;
786d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    private static final int TEST_SYSUI_UID = 56;
796d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    private static final int TEST_DEFAULT_USER = UserHandle.USER_SYSTEM;
802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private static final int TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN = 5;
812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private static final Integer[] TEST_FREQ_LIST = {2400, 2450, 5150, 5175, 5650};
820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_CREATOR_NAME = "com.wificonfigmanager.creator";
830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_UPDATE_NAME = "com.wificonfigmanager.update";
840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_NO_PERM_NAME = "com.wificonfigmanager.noperm";
858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    private static final String TEST_DEFAULT_GW_MAC_ADDRESS = "0f:67:ad:ef:09:34";
860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_HOST_1 = "192.168.48.1";
870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final int    TEST_STATIC_PROXY_PORT_1 = 8000;
880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_EXCLUSION_LIST_1 = "";
890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_PAC_PROXY_LOCATION_1 = "http://bleh";
900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_HOST_2 = "192.168.1.1";
910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final int    TEST_STATIC_PROXY_PORT_2 = 3000;
920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_STATIC_PROXY_EXCLUSION_LIST_2 = "";
930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private static final String TEST_PAC_PROXY_LOCATION_2 = "http://blah";
9450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
9550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private Context mContext;
9650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private FrameworkFacade mFrameworkFacade;
9750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private Clock mClock;
9850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private UserManager mUserManager;
9996241bee619ff7073635f680a36869f61a11a225Roshan Pius    @Mock private TelephonyManager mTelephonyManager;
10050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private WifiKeyStore mWifiKeyStore;
101a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius    @Mock private WifiConfigStore mWifiConfigStore;
1023a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Mock private WifiConfigStoreLegacy mWifiConfigStoreLegacy;
10350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Mock private PackageManager mPackageManager;
1040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Mock private DevicePolicyManagerInternal mDevicePolicyManagerInternal;
1050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Mock private WifiPermissionsWrapper mWifiPermissionsWrapper;
10650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private MockResources mResources;
1086e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private InOrder mContextConfigStoreMockOrder;
109a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius    private WifiConfigManager mWifiConfigManager;
11050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
11150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
112a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Setup the mocks and an instance of WifiConfigManager before each test.
11350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
11450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Before
11550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void setUp() throws Exception {
11650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        MockitoAnnotations.initMocks(this);
11750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Set up the inorder for verifications. This is needed to verify that the broadcasts,
1196e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // store writes for network updates followed by network additions are in the expected order.
1206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        mContextConfigStoreMockOrder = inOrder(mContext, mWifiConfigStore);
1216e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
12250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Set up the package name stuff & permission override.
12350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mContext.getPackageManager()).thenReturn(mPackageManager);
1242dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources = new MockResources();
1252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setBoolean(
1268600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                R.bool.config_wifi_only_link_same_credential_configurations, true);
1272dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
1282dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
1292dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                TEST_MAX_NUM_ACTIVE_CHANNELS_FOR_PARTIAL_SCAN);
1302dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        when(mContext.getResources()).thenReturn(mResources);
1318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
1326d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Setup UserManager profiles for the default user.
1336d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(TEST_DEFAULT_USER);
1346d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
13550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
13650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public String answer(int uid) throws Exception {
13750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                if (uid == TEST_CREATOR_UID) {
13850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return TEST_CREATOR_NAME;
13950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                } else if (uid == TEST_UPDATE_UID) {
14050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return TEST_UPDATE_NAME;
1416d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                } else if (uid == TEST_SYSUI_UID) {
142a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    return WifiConfigManager.SYSUI_PACKAGE_NAME;
1430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                } else if (uid == TEST_NO_PERM_UID) {
1440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                    return TEST_NO_PERM_NAME;
14550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
14650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                fail("Unexpected UID: " + uid);
14750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return "";
14850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
14950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mPackageManager).getNameForUid(anyInt());
1506d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        doAnswer(new AnswerWithArguments() {
1516d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius            public int answer(String packageName, int flags, int userId) throws Exception {
152a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                if (packageName.equals(WifiConfigManager.SYSUI_PACKAGE_NAME)) {
1536d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                    return TEST_SYSUI_UID;
1546d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                } else {
1556d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                    return 0;
1566d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                }
1576d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius            }
1586d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        }).when(mPackageManager).getPackageUidAsUser(anyString(), anyInt(), anyInt());
15950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
16050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Both the UID's in the test have the configuration override permission granted by
16150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // default. This maybe modified for particular tests if needed.
16250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
16350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public int answer(String permName, int uid) throws Exception {
1641fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee                if (uid == TEST_CREATOR_UID || uid == TEST_UPDATE_UID || uid == TEST_SYSUI_UID) {
16550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return PackageManager.PERMISSION_GRANTED;
16650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
16750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return PackageManager.PERMISSION_DENIED;
16850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
16950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
17050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
1711fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        when(mWifiKeyStore
1721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                .updateNetworkKeys(any(WifiConfiguration.class), any(WifiConfiguration.class)))
1731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                .thenReturn(true);
1741fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
1753a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(true);
1763a738a26918230b2469d917dbf14323234edd39bRoshan Pius
1770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(), anyInt()))
1780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(false);
1790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mWifiPermissionsWrapper.getDevicePolicyManagerInternal())
1800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(mDevicePolicyManagerInternal);
1812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
18250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
18350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
18450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
185ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius     * Called after each test
186ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius     */
187ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    @After
188ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    public void cleanup() {
189ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius        validateMockitoUsage();
190ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    }
191ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius
192ee7bdc30d102e05df8d275ebc133afed21808e34Roshan Pius    /**
19350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single network using
194a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
19550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
19650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
19750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleOpenNetwork() {
19850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
19950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
20050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
20150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
20350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
20450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
20550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
20650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
20750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
2080ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        // Ensure that the newly added network is disabled.
2090ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        assertEquals(WifiConfiguration.Status.DISABLED, retrievedNetworks.get(0).status);
21050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
21150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
21250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
21350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the modification of a single network using
214a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
21550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
21650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
21750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetwork() {
21850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
21950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
22050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
22150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
22350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2246e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID for the network.
22550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
2266e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
22750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
22850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that the modification has been effective.
22950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
23050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
23150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
23250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
23350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
23450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
23550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
23650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single ephemeral network using
237a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
238a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * the {@link WifiConfigManager#getSavedNetworks()} does not return this network.
23950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
24050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
241bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    public void testAddSingleEphemeralNetwork() throws Exception {
242bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
243bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        ephemeralNetwork.ephemeral = true;
24450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
245bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        networks.add(ephemeralNetwork);
24650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
247bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyAddEphemeralNetworkToWifiConfigManager(ephemeralNetwork);
24850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
24950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
25050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
25150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
25250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
25350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
25450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Ensure that this is not returned in the saved network list.
25550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(mWifiConfigManager.getSavedNetworks().isEmpty());
25650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
25750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
25850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
259bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Verifies the addition of 2 networks (1 normal and 1 ephemeral) using
260bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and ensures that
261bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * the ephemeral network configuration is not persisted in config store.
262bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
263bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    @Test
264bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    public void testAddMultipleNetworksAndEnsureEphemeralNetworkNotPersisted() {
265bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
266bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        ephemeralNetwork.ephemeral = true;
267bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
268bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
269bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(addNetworkToWifiConfigManager(ephemeralNetwork).isSuccess());
270bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(addNetworkToWifiConfigManager(openNetwork).isSuccess());
271bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
272bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // The open network addition should trigger a store write.
273bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfigStoreData storeData = captureWriteStoreData();
274bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertFalse(isNetworkInConfigStoreData(ephemeralNetwork, storeData));
275bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(isNetworkInConfigStoreData(openNetwork, storeData));
276bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
277bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
278bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
27950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies that the modification of a single open network using
280a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with a UID which
28150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * has no permission to modify the network fails.
28250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
28350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
28450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetworkFailedDueToPermissionDenied() throws Exception {
28550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
28650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
28750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
28850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
29050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
2916e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
29250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
29350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
29450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Deny permission for |UPDATE_UID|.
29550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
29650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public int answer(String permName, int uid) throws Exception {
29750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                if (uid == TEST_CREATOR_UID) {
29850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                    return PackageManager.PERMISSION_GRANTED;
29950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                }
30050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return PackageManager.PERMISSION_DENIED;
30150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
30250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
30350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
30450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration and ensure that the operation failed.
3056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = updateNetworkToWifiConfigManager(openNetwork);
30650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(result.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
30750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
30850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
30950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
31050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies that the modification of a single open network using
311a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with the creator UID
31250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * should always succeed.
31350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
31450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
31550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateSingleOpenNetworkSuccessWithCreatorUID() throws Exception {
31650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
31750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
31850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
31950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
32150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3226e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
32350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
32450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
32550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Deny permission for all UIDs.
32650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        doAnswer(new AnswerWithArguments() {
32750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            public int answer(String permName, int uid) throws Exception {
32850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                return PackageManager.PERMISSION_DENIED;
32950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            }
33050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
33150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
33250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration using the creator UID.
3336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result =
3346e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(openNetwork, TEST_CREATOR_UID);
33550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
33650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
33750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that the modification has been effective.
33850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
33950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
34050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
34150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
34250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
34350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
34450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
34550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single PSK network using
346a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
347a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworks()} masks the password.
34850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
34950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
35050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSinglePskNetwork() {
35150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
35250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
35350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(pskNetwork);
35450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
35650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
35750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
35850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
35950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
36050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
36150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
36250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedSavedNetworks = mWifiConfigManager.getSavedNetworks();
36350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.size(), 1);
36450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.get(0).configKey(), pskNetwork.configKey());
3656e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedSavedNetworks.get(0));
36650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
36750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
36850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
36950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the addition of a single WEP network using
370a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and verifies that
371a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworks()} masks the password.
37250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
37350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
37450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testAddSingleWepNetwork() {
37550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
37650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
37750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(wepNetwork);
37850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
3796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
38050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
38150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
38250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
38350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
38450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
38550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
38650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedSavedNetworks = mWifiConfigManager.getSavedNetworks();
38750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.size(), 1);
38850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertEquals(retrievedSavedNetworks.get(0).configKey(), wepNetwork.configKey());
3896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedSavedNetworks.get(0));
39050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
39150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
39250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
39350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Verifies the modification of an IpConfiguration using
394a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
39550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
39650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    @Test
39750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    public void testUpdateIpConfiguration() {
39850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
39950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
40050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        networks.add(openNetwork);
40150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
4026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
40350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
4046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Now change BSSID of the network.
40550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
40650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
40750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Update the same configuration and ensure that the IP configuration change flags
40850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // are not set.
4096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
41050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
4110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Configure mock DevicePolicyManager to give Profile Owner permission so that we can modify
4120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // proxy settings on a configuration
4130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
4140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_PROFILE_OWNER))).thenReturn(true);
4150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
41650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Change the IpConfiguration now and ensure that the IP configuration flags are set now.
41750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        assertAndSetNetworkIpConfiguration(
41850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                openNetwork,
41950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                WifiConfigurationTestUtil.createStaticIpConfigurationWithStaticProxy());
4206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithIpChange(openNetwork);
42150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
42250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        // Now verify that all the modifications have been effective.
42350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        List<WifiConfiguration> retrievedNetworks =
42450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
42550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
42650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                networks, retrievedNetworks);
42750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
42850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
42950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
430c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * Verifies the removal of a single network using
431a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
432c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
433c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    @Test
434c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    public void testRemoveSingleOpenNetwork() {
435c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
436c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
437c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
438bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that configured network list is not empty.
439bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
440c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
441c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(openNetwork);
442bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that configured network list is empty now.
443bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
444bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
445bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
446bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
447bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Verifies the removal of an ephemeral network using
448bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
449bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
450bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    @Test
451bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    public void testRemoveSingleEphemeralNetwork() throws Exception {
452bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        WifiConfiguration ephemeralNetwork = WifiConfigurationTestUtil.createOpenNetwork();
453bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        ephemeralNetwork.ephemeral = true;
454bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
455bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyAddEphemeralNetworkToWifiConfigManager(ephemeralNetwork);
456bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that configured network list is not empty.
457bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
458c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
459bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyRemoveEphemeralNetworkFromWifiConfigManager(ephemeralNetwork);
460c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Ensure that configured network list is empty now.
461c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
462c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
463c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
464c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
465fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the addition & update of multiple networks using
466a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and the
467c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * removal of networks using
468a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int)}
469c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
470c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    @Test
471fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testAddUpdateRemoveMultipleNetworks() {
472c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
473c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
474c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
475c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
476c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(openNetwork);
477c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(pskNetwork);
478c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        networks.add(wepNetwork);
479c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
480c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
481c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
482c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
483c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
484c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now verify that all the additions has been effective.
485c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        List<WifiConfiguration> retrievedNetworks =
486c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
487c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
488c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                networks, retrievedNetworks);
489c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
490c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Modify all the 3 configurations and update it to WifiConfigManager.
491c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkBSSID(openNetwork, TEST_BSSID);
492c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkBSSID(pskNetwork, TEST_BSSID);
493c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertAndSetNetworkIpConfiguration(
494c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                wepNetwork,
495c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                WifiConfigurationTestUtil.createStaticIpConfigurationWithPacProxy());
496c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
4970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Configure mock DevicePolicyManager to give Profile Owner permission so that we can modify
4980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // proxy settings on a configuration
4990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
5000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_PROFILE_OWNER))).thenReturn(true);
5010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
502c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(openNetwork);
503c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(pskNetwork);
504c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithIpChange(wepNetwork);
505c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now verify that all the modifications has been effective.
506c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
507c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
508c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius                networks, retrievedNetworks);
509c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
510c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Now remove all 3 networks.
511c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(openNetwork);
512c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(pskNetwork);
513c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyRemoveNetworkFromWifiConfigManager(wepNetwork);
514c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
515c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Ensure that configured network list is empty now.
516c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
517c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
518c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
519c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
520fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the update of network status using
521a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)}.
522fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
523fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
524fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testNetworkSelectionStatus() {
525fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
526fc789b2227e92372b2489ca54691310800835a50Roshan Pius
527fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
528fc789b2227e92372b2489ca54691310800835a50Roshan Pius
529fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
530fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
531fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
532fc789b2227e92372b2489ca54691310800835a50Roshan Pius
533fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled. The threshold for association rejection is 5, so
534fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // disable it 5 times to actually mark it temporarily disabled.
535fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
536fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectThreshold =
537a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
538fc789b2227e92372b2489ca54691310800835a50Roshan Pius        for (int i = 1; i <= assocRejectThreshold; i++) {
539fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkSelectionStatus(result.getNetworkId(), assocRejectReason, i);
540fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
541fc789b2227e92372b2489ca54691310800835a50Roshan Pius
542fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to permanently disabled.
543fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
544fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER, 0);
545fc789b2227e92372b2489ca54691310800835a50Roshan Pius
546fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it back to enabled.
547fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
548fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
549fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
550fc789b2227e92372b2489ca54691310800835a50Roshan Pius
551fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
552fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the update of network status using
553a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and ensures that
554fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * enabling a network clears out all the temporary disable counters.
555fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
556fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
557fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testNetworkSelectionStatusEnableClearsDisableCounters() {
558fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
559fc789b2227e92372b2489ca54691310800835a50Roshan Pius
560fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
561fc789b2227e92372b2489ca54691310800835a50Roshan Pius
562fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
563fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
564fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
565fc789b2227e92372b2489ca54691310800835a50Roshan Pius
566fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled 2 times for 2 different reasons.
567fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
568fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 1);
569fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
570fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 2);
571fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
572fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 1);
573fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
574fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 2);
575fc789b2227e92372b2489ca54691310800835a50Roshan Pius
576fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it back to enabled.
577fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
578fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
579fc789b2227e92372b2489ca54691310800835a50Roshan Pius
580fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Ensure that the counters have all been reset now.
581fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
582fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION, 1);
583fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
584fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE, 1);
585fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
586fc789b2227e92372b2489ca54691310800835a50Roshan Pius
587fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
588fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the enabling of temporarily disabled network using
589a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#tryEnableNetwork(int)}.
590fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
591fc789b2227e92372b2489ca54691310800835a50Roshan Pius    @Test
592fc789b2227e92372b2489ca54691310800835a50Roshan Pius    public void testTryEnableNetwork() {
593fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
594fc789b2227e92372b2489ca54691310800835a50Roshan Pius
595fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
596fc789b2227e92372b2489ca54691310800835a50Roshan Pius
597fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set it to enabled.
598fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyUpdateNetworkSelectionStatus(
599fc789b2227e92372b2489ca54691310800835a50Roshan Pius                result.getNetworkId(), NetworkSelectionStatus.NETWORK_SELECTION_ENABLE, 0);
600fc789b2227e92372b2489ca54691310800835a50Roshan Pius
601fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now set it to temporarily disabled. The threshold for association rejection is 5, so
602fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // disable it 5 times to actually mark it temporarily disabled.
603fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectReason = NetworkSelectionStatus.DISABLED_ASSOCIATION_REJECTION;
604fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectThreshold =
605a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[assocRejectReason];
606fc789b2227e92372b2489ca54691310800835a50Roshan Pius        for (int i = 1; i <= assocRejectThreshold; i++) {
607fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkSelectionStatus(result.getNetworkId(), assocRejectReason, i);
608fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
609fc789b2227e92372b2489ca54691310800835a50Roshan Pius
610fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now let's try enabling this network without changing the time, this should fail and the
611fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // status remains temporarily disabled.
612fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertFalse(mWifiConfigManager.tryEnableNetwork(result.getNetworkId()));
613fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus retrievedStatus =
614fc789b2227e92372b2489ca54691310800835a50Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
615fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        .getNetworkSelectionStatus();
616fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(retrievedStatus.isNetworkTemporaryDisabled());
617fc789b2227e92372b2489ca54691310800835a50Roshan Pius
618fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now advance time by the timeout for association rejection and ensure that the network
619fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // is now enabled.
620fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int assocRejectTimeout =
621a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_TIMEOUT_MS[assocRejectReason];
622fc789b2227e92372b2489ca54691310800835a50Roshan Pius        when(mClock.getElapsedSinceBootMillis())
623fc789b2227e92372b2489ca54691310800835a50Roshan Pius                .thenReturn(TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS + assocRejectTimeout);
624fc789b2227e92372b2489ca54691310800835a50Roshan Pius
625fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(mWifiConfigManager.tryEnableNetwork(result.getNetworkId()));
626fc789b2227e92372b2489ca54691310800835a50Roshan Pius        retrievedStatus =
627fc789b2227e92372b2489ca54691310800835a50Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
628fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        .getNetworkSelectionStatus();
629fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
630fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
631fc789b2227e92372b2489ca54691310800835a50Roshan Pius
632fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
633a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the enabling of network using
634a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} and
635a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#disableNetwork(int, int)}.
636a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
637a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
638a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testEnableDisableNetwork() {
639a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
640a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
641a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
642a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
643a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
644a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), false, TEST_CREATOR_UID));
645a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
646a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
647a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
648a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
649a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
650a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
651a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now set it disabled.
652a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_CREATOR_UID));
653a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
654a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
655a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkPermanentlyDisabled());
656a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.DISABLED);
657a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
658a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
659a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
660a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the enabling of network using
661a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} with a UID which
662a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * has no permission to modify the network fails..
663a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
664a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
665a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testEnableDisableNetworkFailedDueToPermissionDenied() throws Exception {
666a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
667a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
668a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
669a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
670a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
671a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), false, TEST_CREATOR_UID));
672a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
673a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
674a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
675a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
676a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
677a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
678a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Deny permission for |UPDATE_UID|.
679a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        doAnswer(new AnswerWithArguments() {
680a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            public int answer(String permName, int uid) throws Exception {
681a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                if (uid == TEST_CREATOR_UID) {
682a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                    return PackageManager.PERMISSION_GRANTED;
683a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                }
684a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                return PackageManager.PERMISSION_DENIED;
685a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            }
686a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
687a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
688a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now try to set it disabled with |TEST_UPDATE_UID|, it should fail and the network
689a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // should remain enabled.
690a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_UPDATE_UID));
691a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedStatus =
692a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId())
693a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                        .getNetworkSelectionStatus();
694a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(retrievedStatus.isNetworkEnabled());
695a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(WifiConfiguration.Status.ENABLED, retrievedNetwork.status);
696a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
697a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
698a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
699a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies the updation of network's connectUid using
700a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#checkAndUpdateLastConnectUid(int, int)}.
701a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
702a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
703a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testUpdateLastConnectUid() throws Exception {
704a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
705a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
706a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
707a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
708a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertTrue(
7092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.checkAndUpdateLastConnectUid(
7102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                        result.getNetworkId(), TEST_CREATOR_UID));
711a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration retrievedNetwork =
712a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
713a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(TEST_CREATOR_UID, retrievedNetwork.lastConnectUid);
714a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
715a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Deny permission for |UPDATE_UID|.
716a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        doAnswer(new AnswerWithArguments() {
717a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            public int answer(String permName, int uid) throws Exception {
718a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                if (uid == TEST_CREATOR_UID) {
719a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                    return PackageManager.PERMISSION_GRANTED;
720a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                }
721a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius                return PackageManager.PERMISSION_DENIED;
722a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius            }
723a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        }).when(mFrameworkFacade).checkUidPermission(anyString(), anyInt());
724a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
725a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Now try to update the last connect UID with |TEST_UPDATE_UID|, it should fail and
726a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // the lastConnectUid should remain the same.
727a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(
7281fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                mWifiConfigManager.checkAndUpdateLastConnectUid(
7291fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                        result.getNetworkId(), TEST_UPDATE_UID));
730a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
731a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertEquals(TEST_CREATOR_UID, retrievedNetwork.lastConnectUid);
732a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
733a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
734a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
735a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration update attempt with an null config is gracefully
736a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
737a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
738a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
739a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
740a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testAddOrUpdateNetworkWithNullConfig() {
741a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(null, TEST_CREATOR_UID);
742a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(result.isSuccess());
743a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
744a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
745a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
746a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration removal attempt with an invalid networkID is gracefully
747a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
748a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#removeNetwork(int)}.
749a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
750a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
751a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testRemoveNetworkWithInvalidNetworkId() {
752a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
753a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
754a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
755a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
756a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        // Change the networkID to an invalid one.
757a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        openNetwork.networkId++;
7586d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertFalse(mWifiConfigManager.removeNetwork(openNetwork.networkId, TEST_CREATOR_UID));
759a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
760a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
761a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
762a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * Verifies that any configuration update attempt with an invalid networkID is gracefully
763a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     * handled.
764a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * This invokes {@link WifiConfigManager#enableNetwork(int, boolean, int)},
765a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#disableNetwork(int, int)},
766a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkSelectionStatus(int, int)} and
767a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#checkAndUpdateLastConnectUid(int, int)}.
768a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius     */
769a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    @Test
770a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    public void testChangeConfigurationWithInvalidNetworkId() {
771a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
772a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
773a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
774a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
775a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertFalse(mWifiConfigManager.enableNetwork(
776a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId() + 1, false, TEST_CREATOR_UID));
77722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertFalse(mWifiConfigManager.disableNetwork(result.getNetworkId() + 1, TEST_CREATOR_UID));
778a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.updateNetworkSelectionStatus(
77922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                result.getNetworkId() + 1, NetworkSelectionStatus.DISABLED_BY_WIFI_MANAGER));
780a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius        assertFalse(mWifiConfigManager.checkAndUpdateLastConnectUid(
78122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                result.getNetworkId() + 1, TEST_CREATOR_UID));
782a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    }
783a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius
784a44a020c95ad74b585c63e1d739942d20d009d23Roshan Pius    /**
7851fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies multiple modification of a single network using
786a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
7871fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * This test is basically checking if the apps can reset some of the fields of the config after
7881fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * addition. The fields being reset in this test are the |preSharedKey| and |wepKeys|.
7891fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 1. Create an open network initially.
7901fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 2. Modify the added network config to a WEP network config with all the 4 keys set.
7911fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 3. Modify the added network config to a WEP network config with only 1 key set.
7921fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * 4. Modify the added network config to a PSK network config.
7931fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
7941fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
7951fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testMultipleUpdatesSingleNetwork() {
7961fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createOpenNetwork();
7971fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
7981fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
7991fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now add |wepKeys| to the network. We don't need to update the |allowedKeyManagement|
8001fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // fields for open to WEP conversion.
8011fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        String[] wepKeys =
8021fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                Arrays.copyOf(WifiConfigurationTestUtil.TEST_WEP_KEYS,
8031fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                        WifiConfigurationTestUtil.TEST_WEP_KEYS.length);
8041fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        int wepTxKeyIdx = WifiConfigurationTestUtil.TEST_WEP_TX_KEY_INDEX;
8051fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
8061fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8071fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
8081fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8091fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
8101fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8111fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now empty out 3 of the |wepKeys[]| and ensure that those keys have been reset correctly.
8121fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        for (int i = 1; i < network.wepKeys.length; i++) {
8131fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            wepKeys[i] = "";
8141fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        }
8151fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepTxKeyIdx = 0;
8161fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
8171fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8181fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
8191fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8201fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
8211fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8221fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now change the config to a PSK network config by resetting the remaining |wepKey[0]|
8231fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // field and setting the |preSharedKey| and |allowedKeyManagement| fields.
8241fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepKeys[0] = "";
8251fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        wepTxKeyIdx = -1;
8261fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkWepKeysAndTxIndex(network, wepKeys, wepTxKeyIdx);
8271fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
8281fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkPreSharedKey(network, WifiConfigurationTestUtil.TEST_PSK);
8291fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8301fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
8311fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8321fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
8331fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
8341fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8351fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
8361fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies the modification of a WifiEnteriseConfig using
837a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}.
8381fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
8391fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
8401fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testUpdateWifiEnterpriseConfig() {
8411fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
8421fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
8431fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8441fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Set the |password| field in WifiEnterpriseConfig and modify the config to PEAP/GTC.
8451fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig =
8461fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
8471fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkEnterprisePassword(network, "test");
8481fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8491fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
8501fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8511fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
8521fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8531fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Reset the |password| field in WifiEnterpriseConfig and modify the config to TLS/None.
8541fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
8551fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.NONE);
8561fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertAndSetNetworkEnterprisePassword(network, "");
8571fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8581fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
8591fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
8601fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                network, mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
8611fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
8621fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8631fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
8641fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Verifies the modification of a single network using
865a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} by passing in nulls
8661fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * in all the publicly exposed fields.
8671fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
8681fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    @Test
8691fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    public void testUpdateSingleNetworkWithNullValues() {
8701fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
8711fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
8721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Save a copy of the original network for comparison.
8741fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfiguration originalNetwork = new WifiConfiguration(network);
8751fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8761fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now set all the public fields to null and try updating the network.
8779cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedAuthAlgorithms.clear();
8789cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedProtocols.clear();
8799cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedKeyManagement.clear();
8809cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedPairwiseCiphers.clear();
8819cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        network.allowedGroupCiphers.clear();
8821fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.setIpConfiguration(null);
8831fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        network.enterpriseConfig = null;
8841fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8859cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        // Update the network.
8869cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        NetworkUpdateResult result = updateNetworkToWifiConfigManager(network);
8879cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
8889cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertFalse(result.isNewNetwork());
8899cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu
8909cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        // Verify no changes to the original network configuration.
8919cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        verifyNetworkUpdateBroadcast(originalNetwork);
8929cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        verifyNetworkInConfigStoreData(originalNetwork);
8939cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertFalse(result.hasIpChanged());
8949cc8b06885dc5889a1ed503b25faff5b83d20978Peter Qiu        assertFalse(result.hasProxyChanged());
8951fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
8961fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Copy over the updated debug params to the original network config before comparison.
8971fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.lastUpdateUid = network.lastUpdateUid;
8981fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.lastUpdateName = network.lastUpdateName;
8991fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        originalNetwork.updateTime = network.updateTime;
9001fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9011fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        // Now verify that there was no change to the network configurations.
9021fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9031fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                originalNetwork,
9041fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(originalNetwork.networkId));
9051fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
9061fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
9071fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
9081230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     * Verifies that the modification of a single network using
909a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} does not modify
9101230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     * existing configuration if there is a failure.
9111230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius     */
9121230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    @Test
9131230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    public void testUpdateSingleNetworkFailureDoesNotModifyOriginal() {
9141230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
9151230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        network.enterpriseConfig =
9161230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
9171230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        verifyAddNetworkToWifiConfigManager(network);
9181230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
9191230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Save a copy of the original network for comparison.
9201230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfiguration originalNetwork = new WifiConfiguration(network);
9211230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
9221230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Now modify the network's EAP method.
9231230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        network.enterpriseConfig =
9241230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                WifiConfigurationTestUtil.createTLSWifiEnterpriseConfigWithNonePhase2();
9251230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
9261230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Fail this update because of cert installation failure.
9271230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        when(mWifiKeyStore
9281230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                .updateNetworkKeys(any(WifiConfiguration.class), any(WifiConfiguration.class)))
9291230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                .thenReturn(false);
9301230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        NetworkUpdateResult result =
9311230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(network, TEST_UPDATE_UID);
9321230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        assertTrue(result.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
9331230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
9341230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        // Now verify that there was no change to the network configurations.
9351230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
9361230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                originalNetwork,
9371230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(originalNetwork.networkId));
9381230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    }
9391230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius
9401230dec4f7c696a08b71785bf1b92d0ba541ecccRoshan Pius    /**
94122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies the matching of networks with different encryption types with the
94222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * corresponding scan detail using
943a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)}.
94422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * The test also verifies that the provided scan detail was cached,
94522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
94622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
94722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testMatchScanDetailToNetworksAndCache() {
94822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Create networks of different types and ensure that they're all matched using
94922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // the corresponding ScanDetail correctly.
95022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
95122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createOpenNetwork());
95222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
95322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createWepNetwork());
95422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
95522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createPskNetwork());
95622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
95722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                WifiConfigurationTestUtil.createEapNetwork());
95822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
95922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
96022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
96122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies that scan details with wrong SSID/authentication types are not matched using
962a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)}
96322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * to the added networks.
96422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
96522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
96622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testNoMatchScanDetailToNetwork() {
96722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // First create networks of different types.
96822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
96922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
97022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
97122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
97222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
97322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now add them to WifiConfigManager.
97422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
97522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(wepNetwork);
97622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
97722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(eapNetwork);
97822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
97922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now create dummy scan detail corresponding to the networks.
98022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail openNetworkScanDetail = createScanDetailForNetwork(openNetwork);
98122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail wepNetworkScanDetail = createScanDetailForNetwork(wepNetwork);
98222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail pskNetworkScanDetail = createScanDetailForNetwork(pskNetwork);
98322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail eapNetworkScanDetail = createScanDetailForNetwork(eapNetwork);
98422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
98522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now mix and match parameters from different scan details.
98622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        openNetworkScanDetail.getScanResult().SSID =
98722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                wepNetworkScanDetail.getScanResult().SSID;
98822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        wepNetworkScanDetail.getScanResult().capabilities =
98922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                pskNetworkScanDetail.getScanResult().capabilities;
99022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        pskNetworkScanDetail.getScanResult().capabilities =
99122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                eapNetworkScanDetail.getScanResult().capabilities;
99222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        eapNetworkScanDetail.getScanResult().capabilities =
99322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                openNetworkScanDetail.getScanResult().capabilities;
99422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
99522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Try to lookup a saved network using the modified scan details. All of these should fail.
99622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(openNetworkScanDetail));
99722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(wepNetworkScanDetail));
99822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(pskNetworkScanDetail));
99922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(eapNetworkScanDetail));
100022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
100122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // All the cache's should be empty as well.
100222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId));
100322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(wepNetwork.networkId));
100422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(pskNetwork.networkId));
100522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNull(mWifiConfigManager.getScanDetailCacheForNetwork(eapNetwork.networkId));
100622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
100722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
100822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
100922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Verifies that scan detail cache is trimmed down when the size of the cache for a network
1010a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * exceeds {@link WifiConfigManager#SCAN_CACHE_ENTRIES_MAX_SIZE}.
101122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
101222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    @Test
101322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    public void testScanDetailCacheTrimForNetwork() {
101422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Add a single network.
101522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
101622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(openNetwork);
101722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
101822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetailCache scanDetailCache;
101922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        String testBssidPrefix = "00:a5:b8:c9:45:";
102022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
102122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Modify |BSSID| field in the scan result and add copies of scan detail
102222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // |SCAN_CACHE_ENTRIES_MAX_SIZE| times.
102322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        int scanDetailNum = 1;
1024a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        for (; scanDetailNum <= WifiConfigManager.SCAN_CACHE_ENTRIES_MAX_SIZE; scanDetailNum++) {
102522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // Create dummy scan detail caches with different BSSID for the network.
102622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            ScanDetail scanDetail =
102722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    createScanDetailForNetwork(
102822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                            openNetwork, String.format("%s%02x", testBssidPrefix, scanDetailNum));
102922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            assertNotNull(
103022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail));
103122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
103222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // The size of scan detail cache should keep growing until it hits
103322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            // |SCAN_CACHE_ENTRIES_MAX_SIZE|.
103422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            scanDetailCache =
103522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                    mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId);
103622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            assertEquals(scanDetailNum, scanDetailCache.size());
103722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        }
103822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
103922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now add the |SCAN_CACHE_ENTRIES_MAX_SIZE + 1| entry. This should trigger the trim.
104022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail scanDetail =
104122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                createScanDetailForNetwork(
104222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                        openNetwork, String.format("%s%02x", testBssidPrefix, scanDetailNum));
104322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail));
104422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
104522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Retrieve the scan detail cache and ensure that the size was trimmed down to
104622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // |SCAN_CACHE_ENTRIES_TRIM_SIZE + 1|. The "+1" is to account for the new entry that
104722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // was added after the trim.
104822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        scanDetailCache = mWifiConfigManager.getScanDetailCacheForNetwork(openNetwork.networkId);
1049a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        assertEquals(WifiConfigManager.SCAN_CACHE_ENTRIES_TRIM_SIZE + 1, scanDetailCache.size());
105022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
105122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
105222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
10532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is false for a newly added network.
10542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10562d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testAddNetworkHasEverConnectedFalse() {
10572d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(WifiConfigurationTestUtil.createOpenNetwork());
10582d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10592d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10602d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10612d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is false for a newly added network even when new config has
10622d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * mistakenly set HasEverConnected to true.
10632d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10642d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10652d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testAddNetworkOverridesHasEverConnectedWhenTrueInNewConfig() {
10662d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
10672d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        openNetwork.getNetworkSelectionStatus().setHasEverConnected(true);
10682d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(openNetwork);
10692d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10702d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10712d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10722d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verify that the |HasEverConnected| is set when
1073a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkAfterConnect(int)} is invoked.
10742d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10752d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
1076cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius    public void testUpdateConfigAfterConnectHasEverConnectedTrue() {
10772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
10782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(openNetwork);
10792d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(openNetwork.networkId);
10802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |preSharedKey| is updated.
10842d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
10852d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
10862d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdatePreSharedKeyClearsHasEverConnected() {
10872d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
10882d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
10892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
10902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different psk.
10922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.preSharedKey.equals("newpassword"));
10932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.preSharedKey = "newpassword";
10942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
10952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
10962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
10972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
10982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |wepKeys| is updated.
10992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateWepKeysClearsHasEverConnected() {
11022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
11032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(wepNetwork);
11042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(wepNetwork.networkId);
11052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different wep.
11072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(wepNetwork.wepKeys[0].equals("newpassword"));
11082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        wepNetwork.wepKeys[0] = "newpassword";
11092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(wepNetwork);
11102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |wepTxKeyIndex| is updated.
11142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateWepTxKeyClearsHasEverConnected() {
11172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration wepNetwork = WifiConfigurationTestUtil.createWepNetwork();
11182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(wepNetwork);
11192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(wepNetwork.networkId);
11202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        // Now update the same network with a different wep.
11222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(wepNetwork.wepTxKeyIndex == 3);
11232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        wepNetwork.wepTxKeyIndex = 3;
11242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(wepNetwork);
11252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedKeyManagement| is
11292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedKeyManagementClearsHasEverConnected() {
11332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
11382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.IEEE8021X);
11392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedProtocol| is
11442d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateProtocolsClearsHasEverConnected() {
11482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedProtocols.get(WifiConfiguration.Protocol.OSEN));
11532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedProtocols.set(WifiConfiguration.Protocol.OSEN);
11542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11562d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11572d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11582d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedAuthAlgorithms| is
11592d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11602d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11612d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11622d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedAuthAlgorithmsClearsHasEverConnected() {
11632d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11642d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11652d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11662d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11672d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedAuthAlgorithms.get(WifiConfiguration.AuthAlgorithm.LEAP));
11682d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.LEAP);
11692d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11702d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11712d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11722d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11732d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedPairwiseCiphers| is
11742d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11752d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11762d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11772d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedPairwiseCiphersClearsHasEverConnected() {
11782d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11792d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11802d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11812d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11822d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.allowedPairwiseCiphers.get(WifiConfiguration.PairwiseCipher.NONE));
11832d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.NONE);
11842d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
11852d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
11862d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11872d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
11882d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |allowedGroup| is
11892d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
11902d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
11912d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
11922d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateAllowedGroupCiphersClearsHasEverConnected() {
11932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
11942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
11952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
11962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
11972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue(pskNetwork.allowedGroupCiphers.get(WifiConfiguration.GroupCipher.WEP104));
11982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.allowedGroupCiphers.clear(WifiConfiguration.GroupCipher.WEP104);
11992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
12002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |hiddenSSID| is
12042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
12052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateHiddenSSIDClearsHasEverConnected() {
12082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
12092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
12102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
12112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.hiddenSSID);
12132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.hiddenSSID = true;
12142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(pskNetwork);
12152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is not cleared when a network config |requirePMF| is
12192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
12202d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateRequirePMFDoesNotClearHasEverConnected() {
12232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
12242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(pskNetwork);
12252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(pskNetwork.networkId);
12262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(pskNetwork.requirePMF);
12282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        pskNetwork.requirePMF = true;
12292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12302d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result =
12312d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(pskNetwork);
12322d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
12332d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
12342d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue("Updating network non-credentials config should not clear hasEverConnected.",
12352d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
12362d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12372d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12382d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
12392d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Verifies that hasEverConnected is cleared when a network config |enterpriseConfig| is
12402d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * updated.
12412d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
12422d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    @Test
12432d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    public void testUpdateEnterpriseConfigClearsHasEverConnected() {
12442d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
12452d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        eapNetwork.enterpriseConfig =
12462d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
12472d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyAddNetworkHasEverConnectedFalse(eapNetwork);
12482d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkAfterConnectHasEverConnectedTrue(eapNetwork.networkId);
12492d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12502d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse(eapNetwork.enterpriseConfig.getEapMethod() == WifiEnterpriseConfig.Eap.TLS);
12512d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        eapNetwork.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
12522d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(eapNetwork);
12532d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
12542d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
12552d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
1256fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius     * Verifies the ordering of network list generated using
1257a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#retrievePnoNetworkList()}.
1258fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius     */
1259fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    @Test
1260fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    public void testRetrievePnoList() {
1261fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Create and add 3 networks.
1262fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createEapNetwork();
1263fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
1264fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
1265fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network1);
1266fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network2);
1267fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        verifyAddNetworkToWifiConfigManager(network3);
1268fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1269fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Enable all of them.
1270a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network1.networkId, false, TEST_CREATOR_UID));
1271a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network2.networkId, false, TEST_CREATOR_UID));
1272a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network3.networkId, false, TEST_CREATOR_UID));
1273fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1274fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now set scan results in 2 of them to set the corresponding
1275fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
1276fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
1277fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
1278fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
1279fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
1280fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1281fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now increment |network3|'s association count. This should ensure that this network
1282fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // is preferred over |network1|.
1283fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
1284fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1285fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Retrieve the Pno network list & verify the order of the networks returned.
1286fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        List<WifiScanner.PnoSettings.PnoNetwork> pnoNetworks =
1287fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius                mWifiConfigManager.retrievePnoNetworkList();
1288fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(3, pnoNetworks.size());
1289fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network3.SSID, pnoNetworks.get(0).ssid);
1290fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network1.SSID, pnoNetworks.get(1).ssid);
1291fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network2.SSID, pnoNetworks.get(2).ssid);
1292fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1293fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Now permanently disable |network3|. This should remove network 3 from the list.
1294fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertTrue(mWifiConfigManager.disableNetwork(network3.networkId, TEST_CREATOR_UID));
1295fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1296fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        // Retrieve the Pno network list again & verify the order of the networks returned.
1297fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        pnoNetworks = mWifiConfigManager.retrievePnoNetworkList();
1298fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(2, pnoNetworks.size());
1299fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network1.SSID, pnoNetworks.get(0).ssid);
1300fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius        assertEquals(network2.SSID, pnoNetworks.get(1).ssid);
1301fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    }
1302fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius
1303fb93fa366b9e705ff014bec41dbd1d709e29e44cRoshan Pius    /**
13048600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have the same default GW Mac address in
1305a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
13068600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
13078600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
13088600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingGwMacAddress() {
13098600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
13108600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
13118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
13128600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
13138600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
13148600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
13158600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13168600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Set the same default GW mac address for all of the networks.
13178600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
13188600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
13198600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
13208600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
13218600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
13228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network3.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
13238600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13248600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now create dummy scan detail corresponding to the networks.
13258600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1);
13268600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2);
13278600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail3 = createScanDetailForNetwork(network3);
13288600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13298600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
13308600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
13318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
13328600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
13338600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail3));
13348600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13358600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
13368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
13378600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
13388600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(2, network.linkedConfigurations.size());
13398600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
13408600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
13418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
13428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
13438600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
13448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
13458600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
13468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
13478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13488600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
13498600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have scan results with same first 16 ASCII of
13508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * bssid in
1351a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
13528600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
13538600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
13548600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingBSSIDMatch() {
13558600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
13568600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
13578600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
13588600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
13598600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
13608600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
13618600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13628600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
13638600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
13648600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
13658600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail3 = createScanDetailForNetwork(network3, "af:89:56:34:56:69");
13668600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13678600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
13688600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
13698600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
13708600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
13718600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail3));
13728600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13738600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
13748600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
13758600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
13768600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(2, network.linkedConfigurations.size());
13778600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
13788600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
13798600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
13808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
13818600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
13828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
13838600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
13848600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
13858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13868600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
13878600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks does not happen for non WPA networks when they have scan
13888600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * results with same first 16 ASCII of bssid in
1389a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
13908600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
13918600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
13928600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNoNetworkLinkUsingBSSIDMatchForNonWpaNetworks() {
13938600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
13948600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
13958600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
13968600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
13978600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
13988600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
13998600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
14008600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
14018600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14028600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
14038600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
14048600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14058600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
14068600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
14078600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
14088600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
14098600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
14108600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
14118600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14128600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
14138600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks does not happen for networks with more than
1414a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#LINK_CONFIGURATION_MAX_SCAN_CACHE_ENTRIES} scan
14158600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * results with same first 16 ASCII of bssid in
1416a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}.
14178600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
14188600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
14198600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNoNetworkLinkUsingBSSIDMatchForNetworksWithHighScanDetailCacheSize() {
14208600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
14218600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
14228600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
14238600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
14248600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14258600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create 7 scan results with bssid which is different in only the last char.
14268600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
14278600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        int scan_result_num = 0;
1428a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        for (; scan_result_num < WifiConfigManager.LINK_CONFIGURATION_MAX_SCAN_CACHE_ENTRIES + 1;
14292dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius             scan_result_num++) {
14308600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            ScanDetail networkScanDetail =
14318600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    createScanDetailForNetwork(
14328600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                            network1, test_bssid_base + Integer.toString(scan_result_num));
14338600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNotNull(
14348600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
14358600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
14368600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14378600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now add 1 scan result to the other network with bssid which is different in only the
14388600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // last char.
14398600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 =
14408600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(
14418600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                        network2, test_bssid_base + Integer.toString(scan_result_num++));
14428600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
14438600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14448600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
14458600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
14468600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
14478600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
14488600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
14498600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
14508600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14518600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
14528600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * Verifies the linking of networks when they have scan results with same first 16 ASCII of
1453a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * bssid in {@link WifiConfigManager#getOrCreateScanDetailCacheForNetwork(WifiConfiguration)}
14548600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     * and then subsequently delinked when the networks have default gateway set which do not match.
14558600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius     */
14568600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    @Test
14578600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    public void testNetworkLinkUsingBSSIDMatchAndThenUnlinkDueToGwMacAddress() {
14588600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
14598600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
14608600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
14618600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
14628600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14638600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Create scan results with bssid which is different in only the last char.
14648600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail1 = createScanDetailForNetwork(network1, "af:89:56:34:56:67");
14658600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        ScanDetail networkScanDetail2 = createScanDetailForNetwork(network2, "af:89:56:34:56:68");
14668600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14678600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now save all these scan details corresponding to each of this network and expect
14688600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // all of these networks to be linked with each other.
14698600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail1));
14708600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail2));
14718600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14728600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        List<WifiConfiguration> retrievedNetworks =
14738600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                mWifiConfigManager.getConfiguredNetworks();
14748600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
14758600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertEquals(1, network.linkedConfigurations.size());
14768600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            for (WifiConfiguration otherNetwork : retrievedNetworks) {
14778600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                if (otherNetwork == network) {
14788600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                    continue;
14798600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                }
14808600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                assertNotNull(network.linkedConfigurations.get(otherNetwork.configKey()));
14818600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            }
14828600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
14838600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14848600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Now Set different GW mac address for both the networks and ensure they're unlinked.
14858600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14868600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network1.networkId, "de:ad:fe:45:23:34"));
14878600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
14888600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                network2.networkId, "ad:de:fe:45:23:34"));
14898600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14908600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        // Add some dummy scan results again to re-evaluate the linking of networks.
14918600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
14928600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(network1, "af:89:56:34:45:67")));
14938600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        assertNotNull(mWifiConfigManager.getSavedNetworkForScanDetailAndCache(
14948600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius                createScanDetailForNetwork(network1, "af:89:56:34:45:68")));
14958600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
14968600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworks();
14978600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
14988600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius            assertNull(network.linkedConfigurations);
14998600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius        }
15008600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    }
15018600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius
150260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    /**
15032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
150460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)}.
15052dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
15062dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
15072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetwork() {
15082dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
15092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
15102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15112dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
15122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
15132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
15142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
15152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
15162dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
15172dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
15182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
15192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15202dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
15212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
152260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network.networkId, 1,
15232ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        TEST_FREQ_LIST[4]));
152460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    }
152560ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
152660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    /**
152760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * Verifies the creation of channel list using
152860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
152960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that the frequenecy of the currently connected network is in the returned
153060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * channel set.
153160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     */
153260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    @Test
153360ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan    public void testFetchChannelSetForNetworkIncludeCurrentNetwork() {
153460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
153560ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        verifyAddNetworkToWifiConfigManager(network);
153660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
153760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        // Create 5 scan results with different bssid's & frequencies.
153860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        String test_bssid_base = "af:89:56:34:56:6";
153960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
154060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan            ScanDetail networkScanDetail =
154160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                    createScanDetailForNetwork(
154260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
154360ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan            assertNotNull(
154460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
154560ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
154660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        }
154760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
154860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        // Currently connected network frequency 2427 is not in the TEST_FREQ_LIST
154960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        Set<Integer> freqs = mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
155060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                network.networkId, 1, 2427);
155160ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan
155260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan        assertEquals(true, freqs.contains(2427));
15532dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
15542dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15552dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
15562dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
155760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
155860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that scan results which have a timestamp  beyond the provided age are not used
155960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * in the channel list.
15602dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
15612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
15622dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIgnoresStaleScanResults() {
15632dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
15642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
15652dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        long wallClockBase = 0;
15672dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
15682dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
15692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
15702dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            // Increment the seen value in the scan results for each of them.
15712dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            when(mClock.getWallClockMillis()).thenReturn(wallClockBase + i);
15722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
15732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
15742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
15752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
15762dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
15772dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15782dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
15792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int ageInMillis = 4;
15802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Now fetch only scan results which are 4 millis stale. This should ignore the first
15812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // scan result.
15822dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(
15832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                new HashSet<>(Arrays.asList(
15842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                        Arrays.copyOfRange(
15852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                                TEST_FREQ_LIST,
15862dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                                TEST_FREQ_LIST.length - ageInMillis, TEST_FREQ_LIST.length))),
15872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
158860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network.networkId, ageInMillis, TEST_FREQ_LIST[4]));
15892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
15902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
15912dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
15922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
159360ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
159460ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that the list size does not exceed the max configured for the device.
15952dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
15962dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
15972dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIsLimitedToConfiguredSize() {
1598a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        // Need to recreate the WifiConfigManager instance for this test to modify the config
15992dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // value which is read only in the constructor.
16002dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int maxListSize = 3;
16012dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
16022dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
16032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                maxListSize);
16042dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
16052dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16062dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createPskNetwork();
16072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
16082dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 5 scan results with different bssid's & frequencies.
16102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
16112dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (int i = 0; i < TEST_FREQ_LIST.length; i++) {
16122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
16132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
16142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network, test_bssid_base + Integer.toString(i), 0, TEST_FREQ_LIST[i]);
16152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
16162dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
16172dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
16192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Ensure that the fetched list size is limited.
16202dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
16212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
162260ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network.networkId, 1, TEST_FREQ_LIST[4]).size());
16232dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
16242dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
16262dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
162760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
162860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that scan results from linked networks are used in the channel list.
16292dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
16302dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
16312dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIncludesLinkedNetworks() {
16322dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
16332dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
16342dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
16352dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
16362dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16372dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
16382dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int TEST_FREQ_LISTIdx = 0;
16392dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 1.
16402dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
16412dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
16422dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
16432dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
16442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
16452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
16462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
16472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16482dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
16492dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 2.
16502dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
16512dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
16522dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
16532dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
16542dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
16552dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
16562dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
16572dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
16582dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16592dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Link the 2 configurations together using the GwMacAddress.
16602dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
16612dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
16622dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
16632dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
16642dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16652dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // The channel list fetched should include scan results from both the linked networks.
16662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
166760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network1.networkId, 1,
16682ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        TEST_FREQ_LIST[0]));
16692dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(new HashSet<Integer>(Arrays.asList(TEST_FREQ_LIST)),
167060ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(network2.networkId, 1,
16712ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        TEST_FREQ_LIST[0]));
16722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
16732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
16752dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Verifies the creation of channel list using
167660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * {@link WifiConfigManager#fetchChannelSetForNetworkForPartialScan(int, long, int)} and
167760ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * ensures that scan results from linked networks are used in the channel list and that the
167860ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan     * list size does not exceed the max configured for the device.
16792dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
16802dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    @Test
16812dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    public void testFetchChannelSetForNetworkIncludesLinkedNetworksIsLimitedToConfiguredSize() {
1682a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius        // Need to recreate the WifiConfigManager instance for this test to modify the config
16832dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // value which is read only in the constructor.
16842dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int maxListSize = 3;
16852dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mResources.setInteger(
16862dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                R.integer.config_wifi_framework_associated_partial_scan_max_num_active_channels,
16872dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                maxListSize);
16882dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16892dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        createWifiConfigManager();
16902dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createPskNetwork();
16912dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
16922dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
16932dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
16942dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
16952dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        String test_bssid_base = "af:89:56:34:56:6";
16962dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        int TEST_FREQ_LISTIdx = 0;
16972dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 1.
16982dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length / 2; TEST_FREQ_LISTIdx++) {
16992dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
17002dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
17012dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network1, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
17022dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
17032dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
17042dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
17052dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17062dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
17072dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Create 3 scan results with different bssid's & frequencies for network 2.
17082dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        for (; TEST_FREQ_LISTIdx < TEST_FREQ_LIST.length; TEST_FREQ_LISTIdx++) {
17092dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            ScanDetail networkScanDetail =
17102dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    createScanDetailForNetwork(
17112dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            network2, test_bssid_base + Integer.toString(TEST_FREQ_LISTIdx), 0,
17122dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                            TEST_FREQ_LIST[TEST_FREQ_LISTIdx]);
17132dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            assertNotNull(
17142dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                    mWifiConfigManager.getSavedNetworkForScanDetailAndCache(networkScanDetail));
17152dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        }
17162dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17172dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Link the 2 configurations together using the GwMacAddress.
17182dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
17192dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network1.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
17202dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertTrue(mWifiConfigManager.setNetworkDefaultGwMacAddress(
17212dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                network2.networkId, TEST_DEFAULT_GW_MAC_ADDRESS));
17222dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
17232dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        // Ensure that the fetched list size is limited.
17242dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
17252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
172660ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network1.networkId, 1, TEST_FREQ_LIST[0]).size());
17272dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        assertEquals(maxListSize,
17282dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mWifiConfigManager.fetchChannelSetForNetworkForPartialScan(
172960ecc292c27e34df1a9414da0d6482cce718efbcRandy Pan                        network2.networkId, 1, TEST_FREQ_LIST[0]).size());
17302dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
17312dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
1732c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
1733a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
17342ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * and ensures that any shared private networks networkId is not changed.
17352ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Test scenario:
17362ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 1. Load the shared networks from shared store and user 1 store.
17372ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 2. Switch to user 2 and ensure that the shared network's Id is not changed.
17382ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     */
17392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    @Test
17402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    public void testHandleUserSwitchDoesNotChangeSharedNetworksId() throws Exception {
17412ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user1 = TEST_DEFAULT_USER;
17422ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
17432ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        setupUserProfiles(user2);
17442ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
17452ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int appId = 674;
17462ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
17472ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
17482ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
17492ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.shared = false;
17502ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
17512ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
17522ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.shared = false;
17532ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
17542ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration sharedNetwork1 = WifiConfigurationTestUtil.createPskNetwork();
17552ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration sharedNetwork2 = WifiConfigurationTestUtil.createPskNetwork();
17562ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
17572ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the store data that is loaded initially.
17582ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
17592ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
17602ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork1);
17612ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork2);
17622ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
17632ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
17642ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user1Networks = new ArrayList<WifiConfiguration>() {
17652ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
17662ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user1Network);
17672ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
17682ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
17692ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData loadStoreData =
17702ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                new WifiConfigStoreData(sharedNetworks, user1Networks, new HashSet<String>());
17712ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.read()).thenReturn(loadStoreData);
17722ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
17732ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
17742ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Fetch the network ID's assigned to the shared networks initially.
17752ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int sharedNetwork1Id = WifiConfiguration.INVALID_NETWORK_ID;
17762ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int sharedNetwork2Id = WifiConfiguration.INVALID_NETWORK_ID;
17772ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> retrievedNetworks =
17782ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
17792ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
17802ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            if (network.configKey().equals(sharedNetwork1.configKey())) {
17812ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                sharedNetwork1Id = network.networkId;
17822ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            } else if (network.configKey().equals(sharedNetwork2.configKey())) {
17832ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                sharedNetwork2Id = network.networkId;
17842ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
17852ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        }
17862ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(sharedNetwork1Id != WifiConfiguration.INVALID_NETWORK_ID);
17872ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(sharedNetwork2Id != WifiConfiguration.INVALID_NETWORK_ID);
17882ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
17892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the user 2 store data that is loaded at user switch.
17902ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() {
17912ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
17922ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user2Network);
17932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
17942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
17952ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData newUserStoreData =
17962ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                new WifiConfigStoreData(new ArrayList<WifiConfiguration>(), user2Networks,
17972ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        new HashSet<String>());
17982ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
17992ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(newUserStoreData);
18002ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now switch the user to user 2 and ensure that shared network's IDs have not changed.
18012ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
18022ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mWifiConfigManager.handleUserSwitch(user2);
18032ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18042ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Again fetch the network ID's assigned to the shared networks and ensure they have not
18052ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // changed.
18062ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int updatedSharedNetwork1Id = WifiConfiguration.INVALID_NETWORK_ID;
18072ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int updatedSharedNetwork2Id = WifiConfiguration.INVALID_NETWORK_ID;
18082ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
18092ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
18102ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            if (network.configKey().equals(sharedNetwork1.configKey())) {
18112ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                updatedSharedNetwork1Id = network.networkId;
18122ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            } else if (network.configKey().equals(sharedNetwork2.configKey())) {
18132ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                updatedSharedNetwork2Id = network.networkId;
18142ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
18152ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        }
18162ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertEquals(sharedNetwork1Id, updatedSharedNetwork1Id);
18172ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertEquals(sharedNetwork2Id, updatedSharedNetwork2Id);
18182ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    }
18192ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18202ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    /**
18212ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
18222ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * and ensures that any old user private networks are not visible anymore.
18232ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Test scenario:
18242ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 1. Load the shared networks from shared store and user 1 store.
18252ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 2. Switch to user 2 and ensure that the user 1's private network has been removed.
18262ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     */
18272ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    @Test
18282ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    public void testHandleUserSwitchRemovesOldUserPrivateNetworks() throws Exception {
18292ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user1 = TEST_DEFAULT_USER;
18302ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
18312ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        setupUserProfiles(user2);
18322ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18332ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        int appId = 674;
18342ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18352ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
18362ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
18372ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.shared = false;
18382ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
18392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
18402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.shared = false;
18412ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
18422ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
18432ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18442ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the store data that is loaded initially.
18452ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
18462ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
18472ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork);
18482ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
18492ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
18502ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user1Networks = new ArrayList<WifiConfiguration>() {
18512ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
18522ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user1Network);
18532ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
18542ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
18552ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData loadStoreData =
18562ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                new WifiConfigStoreData(sharedNetworks, user1Networks, new HashSet<String>());
18572ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.read()).thenReturn(loadStoreData);
18582ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
18592ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18601cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Fetch the network ID assigned to the user 1 network initially.
18611cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int user1NetworkId = WifiConfiguration.INVALID_NETWORK_ID;
18621cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        List<WifiConfiguration> retrievedNetworks =
18631cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
18641cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        for (WifiConfiguration network : retrievedNetworks) {
18651cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            if (network.configKey().equals(user1Network.configKey())) {
18661cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                user1NetworkId = network.networkId;
18671cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            }
18681cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        }
18691cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
18702ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the user 2 store data that is loaded at user switch.
18712ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() {
18722ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
18732ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user2Network);
18742ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
18752ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
18762ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData newUserStoreData =
18772ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                new WifiConfigStoreData(new ArrayList<WifiConfiguration>(), user2Networks,
18782ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        new HashSet<String>());
18792ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
18802ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(newUserStoreData);
18812ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now switch the user to user 2 and ensure that user 1's private network has been removed.
18822ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
18831cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        Set<Integer> removedNetworks = mWifiConfigManager.handleUserSwitch(user2);
18841cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue((removedNetworks.size() == 1) && (removedNetworks.contains(user1NetworkId)));
18852ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
18862ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set the expected networks to be |sharedNetwork| and |user2Network|.
18872ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        List<WifiConfiguration> expectedNetworks = new ArrayList<WifiConfiguration>() {
18882ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            {
18892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(sharedNetwork);
18902ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                add(user2Network);
18912ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            }
18922ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        };
18932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
18942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                expectedNetworks, mWifiConfigManager.getConfiguredNetworksWithPasswords());
18951cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
18961cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Send another user switch  indication with the same user 2. This should be ignored and
18971cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // hence should not remove any new networks.
18981cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
18991cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        removedNetworks = mWifiConfigManager.handleUserSwitch(user2);
19001cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue(removedNetworks.isEmpty());
19011cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    }
19021cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
19031cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    /**
19041cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
19051cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * and ensures that user switch from a user with no private networks is handled.
19061cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * Test scenario:
19071cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * 1. Load the shared networks from shared store and emptu user 1 store.
19081cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * 2. Switch to user 2 and ensure that no private networks were removed.
19091cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     */
19101cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    @Test
19111cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius    public void testHandleUserSwitchWithNoOldUserPrivateNetworks() throws Exception {
19121cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int user1 = TEST_DEFAULT_USER;
19131cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
19141cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        setupUserProfiles(user2);
19151cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
19161cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        int appId = 674;
19171cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
19181cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Create 2 networks. 1 for user2 and 1 shared.
19191cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
19201cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        user2Network.shared = false;
19211cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
19221cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
19231cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
19241cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Set up the store data that is loaded initially.
19251cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
19261cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            {
19271cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                add(sharedNetwork);
19281cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            }
19291cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        };
19301cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        WifiConfigStoreData loadStoreData =
19311cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                new WifiConfigStoreData(sharedNetworks, new ArrayList<WifiConfiguration>(),
19321cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                        new HashSet<String>());
19331cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        when(mWifiConfigStore.read()).thenReturn(loadStoreData);
19341cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
19351cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius
19361cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Set up the user 2 store data that is loaded at user switch.
19371cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        List<WifiConfiguration> user2Networks = new ArrayList<WifiConfiguration>() {
19381cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            {
19391cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                add(user2Network);
19401cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius            }
19411cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        };
19421cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        WifiConfigStoreData newUserStoreData =
19431cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                new WifiConfigStoreData(new ArrayList<WifiConfiguration>(), user2Networks,
19441cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                        new HashSet<String>());
19451cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
19461cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius                .thenReturn(newUserStoreData);
19471cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        // Now switch the user to user 2 and ensure that no private network has been removed.
19481cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
19491cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        Set<Integer> removedNetworks = mWifiConfigManager.handleUserSwitch(user2);
19501cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius        assertTrue(removedNetworks.isEmpty());
19512ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    }
19522ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19532ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius    /**
19542ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
1955c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * and ensures that any non current user private networks are moved to shared store file.
19561cb361461f6ecc684761fc3940c1db622192cad1Roshan Pius     * This test simulates the following test case:
19572ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 1. Loads the shared networks from shared store at bootup.
19582ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 2. Load the private networks from user store on user 1 unlock.
19592ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * 3. Switch to user 2 and ensure that the user 2's private network has been moved to user 2's
19602ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius     * private store file.
1961c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
1962c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
1963c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchPushesOtherPrivateNetworksToSharedStore() throws Exception {
19646d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
19656d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
1966c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
1967c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1968c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        int appId = 674;
1969c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
1970c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Create 3 networks. 1 for user1, 1 for user2 and 1 shared.
1971c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration user1Network = WifiConfigurationTestUtil.createPskNetwork();
1972c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user1Network.shared = false;
1973c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user1Network.creatorUid = UserHandle.getUid(user1, appId);
1974c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
1975c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user2Network.shared = false;
1976c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        user2Network.creatorUid = UserHandle.getUid(user2, appId);
1977c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final WifiConfiguration sharedNetwork = WifiConfigurationTestUtil.createPskNetwork();
1978c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
19792ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the shared store data that is loaded at bootup. User 2's private network
19802ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // is still in shared store because they have not yet logged-in after upgrade.
1981c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> sharedNetworks = new ArrayList<WifiConfiguration>() {
1982c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
1983c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(sharedNetwork);
1984c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user2Network);
1985c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
1986c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
19872ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData loadStoreData =
19882ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                new WifiConfigStoreData(sharedNetworks, new ArrayList<WifiConfiguration>(),
19892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        new HashSet<String>());
19902ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.read()).thenReturn(loadStoreData);
19912ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        assertTrue(mWifiConfigManager.loadFromStore());
19922ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius
19932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Set up the user store data that is loaded at user unlock.
1994c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> userNetworks = new ArrayList<WifiConfiguration>() {
1995c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
1996c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user1Network);
1997c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
1998c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
19992ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData unlockLoadStoreData =
20002ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                new WifiConfigStoreData(new ArrayList<WifiConfiguration>(), userNetworks,
20012ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                        new HashSet<String>());
20022ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
20032ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(unlockLoadStoreData);
20042ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
20052ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Capture the written data for the user 1 and ensure that it corresponds to what was
20062ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // setup.
20072ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigStoreData writtenStoreData = captureWriteStoreData();
20082ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
20092ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                sharedNetworks, writtenStoreData.getSharedConfigurations());
20102ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
20112ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                userNetworks, writtenStoreData.getUserConfigurations());
2012c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
20132ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now switch the user to user2 and ensure that user 2's private network has been moved to
20142ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // the user store.
20152ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2016c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2017c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Set the expected network list before comparing. user1Network should be in shared data.
2018c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Note: In the real world, user1Network will no longer be visible now because it should
2019c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // already be in user1's private store file. But, we're purposefully exposing it
2020c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // via |loadStoreData| to test if other user's private networks are pushed to shared store.
2021c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> expectedSharedNetworks = new ArrayList<WifiConfiguration>() {
2022c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
2023c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(sharedNetwork);
2024c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user1Network);
2025c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2026c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
2027c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<WifiConfiguration> expectedUserNetworks = new ArrayList<WifiConfiguration>() {
2028c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            {
2029c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                add(user2Network);
2030c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
2031c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        };
20322ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Capture the first written data triggered for saving the old user's network
20332ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // configurations.
20342ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        writtenStoreData = captureWriteStoreData();
20352ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
20362ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                sharedNetworks, writtenStoreData.getSharedConfigurations());
20372ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
20382ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                userNetworks, writtenStoreData.getUserConfigurations());
2039c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
20402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // Now capture the next written data triggered after the switch and ensure that user 2's
20412ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        // network is now in user store data.
2042c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        writtenStoreData = captureWriteStoreData();
2043c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
2044c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                expectedSharedNetworks, writtenStoreData.getSharedConfigurations());
2045c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
2046c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                expectedUserNetworks, writtenStoreData.getUserConfigurations());
2047c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2048c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2049c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2050a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
2051a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * and {@link WifiConfigManager#handleUserUnlock(int)} and ensures that the new store is
2052c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * read immediately if the user is unlocked during the switch.
2053c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2054c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
2055c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchWhenUnlocked() throws Exception {
20566d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
20576d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2058c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2059c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
20602ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
20612ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(new WifiConfigStoreData(
2062c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
2063c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new HashSet<String>()));
2064c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2065c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // user2 is unlocked and switched to foreground.
2066c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2067c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2068c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Ensure that the read was invoked.
20692ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
20702ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2071c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2072c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2073c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2074a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the foreground user switch using {@link WifiConfigManager#handleUserSwitch(int)}
2075a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * and {@link WifiConfigManager#handleUserUnlock(int)} and ensures that the new store is not
2076c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * read until the user is unlocked.
2077c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2078c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserSwitchWhenLocked() throws Exception {
20796d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
20806d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2081c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2082c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2083c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // user2 is locked and switched to foreground.
2084c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
2085c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2086c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2087c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Ensure that the read was not invoked.
20882ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
20892ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2090c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2091c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now try unlocking some other user (user1), this should be ignored.
2092c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserUnlock(user1);
20932ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
20942ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2095c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
20962ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
20972ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(new WifiConfigStoreData(
2098c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
2099c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                        new HashSet<String>()));
2100c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2101c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Unlock the user2 and ensure that we read the data now.
2102c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserUnlock(user2);
21032ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
21042ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2105c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2106c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2107c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
2108a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies that the foreground user stop using {@link WifiConfigManager#handleUserStop(int)}
2109c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * and ensures that the store is written only when the foreground user is stopped.
2110c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
2111c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    @Test
2112c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    public void testHandleUserStop() throws Exception {
21136d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user1 = TEST_DEFAULT_USER;
21146d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2115c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        setupUserProfiles(user2);
2116c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2117c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Try stopping background user2 first, this should not do anything.
2118c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
2119c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserStop(user2);
21202ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
21212ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2122c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
2123c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        // Now try stopping the foreground user1, this should trigger a write to store.
2124c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mWifiConfigManager.handleUserStop(user1);
21252ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
21262ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2127c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore).write(
2128c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                anyBoolean(), any(WifiConfigStoreData.class));
2129c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
2130c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
21316d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    /**
2132b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)}
2133b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * results in a store read after bootup.
2134b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     */
2135b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    @Test
2136b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    public void testHandleUserUnlockAfterBootup() throws Exception {
2137b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user1 = TEST_DEFAULT_USER;
2138b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
21392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
21402ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(new WifiConfigStoreData(
2141b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
2142b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new HashSet<String>()));
2143b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2144b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Unlock the user1 (default user) for the first time and ensure that we read the data.
2145b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserUnlock(user1);
21462ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
21472ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2148b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    }
2149b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2150b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    /**
2151b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * Verifies the foreground user unlock via {@link WifiConfigManager#handleUserUnlock(int)} does
2152b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     * not always result in a store read unless the user had switched or just booted up.
2153b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius     */
2154b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    @Test
2155b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    public void testHandleUserUnlockWithoutSwitchOrBootup() throws Exception {
2156b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user1 = TEST_DEFAULT_USER;
2157b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        int user2 = TEST_DEFAULT_USER + 1;
2158b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        setupUserProfiles(user2);
2159b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
21602ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        when(mWifiConfigStore.switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class)))
21612ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .thenReturn(new WifiConfigStoreData(
2162b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new ArrayList<WifiConfiguration>(), new ArrayList<WifiConfiguration>(),
2163b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius                        new HashSet<String>()));
2164b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2165b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // user2 is unlocked and switched to foreground.
2166b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(true);
2167b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserSwitch(user2);
2168b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Ensure that the read was invoked.
21692ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore)
21702ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2171b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2172b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        // Unlock the user2 again and ensure that we don't read the data now.
2173b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius        mWifiConfigManager.handleUserUnlock(user2);
21742ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
21752ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius                .switchUserStoreAndRead(any(WifiConfigStore.StoreFile.class));
2176b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    }
2177b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius
2178b3706e8c20fdf0a0e2b4ec15355ae6f98588b732Roshan Pius    /**
21796d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * Verifies the private network addition using
2180a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
21816d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * by a non foreground user is rejected.
21826d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     */
21836d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    @Test
21846d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    public void testAddNetworkUsingBackgroundUserUId() throws Exception {
21856d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
21866d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(user2);
21876d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
21886d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int creatorUid = UserHandle.getUid(user2, 674);
21896d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
21906d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Create a network for user2 try adding it. This should be rejected.
21916d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
21926d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        NetworkUpdateResult result =
21936d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(user2Network, creatorUid);
21946d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertFalse(result.isSuccess());
21956d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    }
21966d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
21976d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    /**
21986d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * Verifies the private network addition using
2199a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)}
22006d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     * by SysUI is always accepted.
22016d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius     */
22026d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    @Test
22036d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    public void testAddNetworkUsingSysUiUid() throws Exception {
22046d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Set up the user profiles stuff. Needed for |WifiConfigurationUtil.isVisibleToAnyProfile|
22056d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        int user2 = TEST_DEFAULT_USER + 1;
22066d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        setupUserProfiles(user2);
22076d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
22086d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(user2)).thenReturn(false);
22096d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        mWifiConfigManager.handleUserSwitch(user2);
22106d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
22116d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        // Create a network for user2 try adding it. This should be rejected.
22126d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        final WifiConfiguration user2Network = WifiConfigurationTestUtil.createPskNetwork();
22136d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        NetworkUpdateResult result =
22146d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(user2Network, TEST_SYSUI_UID);
22156d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertTrue(result.isSuccess());
22166d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius    }
22176d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius
22183a738a26918230b2469d917dbf14323234edd39bRoshan Pius    /**
2219a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#loadFromStore()} attempts
22203a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * to migrate data from legacy stores when the new store files are absent.
22213a738a26918230b2469d917dbf14323234edd39bRoshan Pius     */
22223a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Test
22233a738a26918230b2469d917dbf14323234edd39bRoshan Pius    public void testMigrationFromLegacyStore() throws Exception {
22243a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Create the store data to be returned from legacy stores.
22253a738a26918230b2469d917dbf14323234edd39bRoshan Pius        List<WifiConfiguration> networks = new ArrayList<>();
22263a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createPskNetwork());
22273a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createEapNetwork());
22283a738a26918230b2469d917dbf14323234edd39bRoshan Pius        networks.add(WifiConfigurationTestUtil.createWepNetwork());
2229674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        String deletedEphemeralSSID = "EphemeralSSID";
2230674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        Set<String> deletedEphermalSSIDs = new HashSet<>(Arrays.asList(deletedEphemeralSSID));
22313a738a26918230b2469d917dbf14323234edd39bRoshan Pius        WifiConfigStoreDataLegacy storeData =
2232674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius                new WifiConfigStoreDataLegacy(networks, deletedEphermalSSIDs);
22333a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22343a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // New store files not present, so migrate from the old store.
22353a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(false);
22363a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(true);
22373a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.read()).thenReturn(storeData);
22383a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22393a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Now trigger a load from store. This should populate the in memory list with all the
22403a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // networks above from the legacy store.
22413a738a26918230b2469d917dbf14323234edd39bRoshan Pius        mWifiConfigManager.loadFromStore();
22423a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22433a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStore, never()).read();
22443a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStoreLegacy).read();
2245b2c8d28046e96c4506482e030c6320cda6db8f30Roshan Pius        verify(mWifiConfigStoreLegacy).removeStores();
22463a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22473a738a26918230b2469d917dbf14323234edd39bRoshan Pius        List<WifiConfiguration> retrievedNetworks =
22483a738a26918230b2469d917dbf14323234edd39bRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
22493a738a26918230b2469d917dbf14323234edd39bRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
22503a738a26918230b2469d917dbf14323234edd39bRoshan Pius                networks, retrievedNetworks);
2251674b332946074bba7fae1bb4d0d6d2c72d70f3a8Roshan Pius        assertTrue(mWifiConfigManager.wasEphemeralNetworkDeleted(deletedEphemeralSSID));
22523a738a26918230b2469d917dbf14323234edd39bRoshan Pius    }
22533a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22543a738a26918230b2469d917dbf14323234edd39bRoshan Pius    /**
2255a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * Verifies the loading of networks using {@link WifiConfigManager#loadFromStore()} does
22563a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * not attempt to read from any of the stores (new or legacy) when the store files are
22573a738a26918230b2469d917dbf14323234edd39bRoshan Pius     * not present.
22583a738a26918230b2469d917dbf14323234edd39bRoshan Pius     */
22593a738a26918230b2469d917dbf14323234edd39bRoshan Pius    @Test
22603a738a26918230b2469d917dbf14323234edd39bRoshan Pius    public void testFreshInstallDoesNotLoadFromStore() throws Exception {
22613a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // New store files not present, so migrate from the old store.
22623a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStore.areStoresPresent()).thenReturn(false);
22633a738a26918230b2469d917dbf14323234edd39bRoshan Pius        when(mWifiConfigStoreLegacy.areStoresPresent()).thenReturn(false);
22643a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22653a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // Now trigger a load from store. This should populate the in memory list with all the
22663a738a26918230b2469d917dbf14323234edd39bRoshan Pius        // networks above.
22673a738a26918230b2469d917dbf14323234edd39bRoshan Pius        mWifiConfigManager.loadFromStore();
22683a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22693a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStore, never()).read();
22703a738a26918230b2469d917dbf14323234edd39bRoshan Pius        verify(mWifiConfigStoreLegacy, never()).read();
22713a738a26918230b2469d917dbf14323234edd39bRoshan Pius
22723a738a26918230b2469d917dbf14323234edd39bRoshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworksWithPasswords().isEmpty());
22733a738a26918230b2469d917dbf14323234edd39bRoshan Pius    }
22743a738a26918230b2469d917dbf14323234edd39bRoshan Pius
2275a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    /**
2276a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius     * Verifies that the last user selected network parameter is set when
2277a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#enableNetwork(int, boolean, int)} with disableOthers flag is set
2278a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * to true and cleared when either {@link WifiConfigManager#disableNetwork(int, int)} or
2279a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int, int)} is invoked using the same network ID.
2280a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius     */
2281a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    @Test
2282a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    public void testLastSelectedNetwork() throws Exception {
2283a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        WifiConfiguration openNetwork = WifiConfigurationTestUtil.createOpenNetwork();
2284a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(openNetwork);
2285a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2286a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        when(mClock.getElapsedSinceBootMillis()).thenReturn(67L);
2287a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
2288a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), true, TEST_CREATOR_UID));
2289a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(result.getNetworkId(), mWifiConfigManager.getLastSelectedNetwork());
2290a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(67, mWifiConfigManager.getLastSelectedTimeStamp());
2291a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2292a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        // Now disable the network and ensure that the last selected flag is cleared.
2293a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.disableNetwork(result.getNetworkId(), TEST_CREATOR_UID));
2294a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(
2295a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                WifiConfiguration.INVALID_NETWORK_ID, mWifiConfigManager.getLastSelectedNetwork());
2296a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2297a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        // Enable it again and remove the network to ensure that the last selected flag was cleared.
2298a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.enableNetwork(
2299a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                result.getNetworkId(), true, TEST_CREATOR_UID));
2300a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(result.getNetworkId(), mWifiConfigManager.getLastSelectedNetwork());
230165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertEquals(openNetwork.configKey(), mWifiConfigManager.getLastSelectedNetworkConfigKey());
2302a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
2303a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(result.getNetworkId(), TEST_CREATOR_UID));
2304a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius        assertEquals(
2305a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius                WifiConfiguration.INVALID_NETWORK_ID, mWifiConfigManager.getLastSelectedNetwork());
2306a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius    }
2307a95a5d9dfc327f165d4e254f1b11a9204974037dRoshan Pius
230865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    /**
230965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     * Verifies that all the networks for the provided app is removed when
2310a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetworksForApp(ApplicationInfo)} is invoked.
231165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     */
231265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    @Test
231365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    public void testRemoveNetworksForApp() throws Exception {
231465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createOpenNetwork());
231565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createPskNetwork());
231665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createWepNetwork());
231765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
231865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
231965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
232065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        ApplicationInfo app = new ApplicationInfo();
232165245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        app.uid = TEST_CREATOR_UID;
232265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        app.packageName = TEST_CREATOR_NAME;
23231fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee        assertEquals(3, mWifiConfigManager.removeNetworksForApp(app).size());
232465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
232565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        // Ensure all the networks are removed now.
232665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
232765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    }
232865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
232965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    /**
233065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     * Verifies that all the networks for the provided user is removed when
2331a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetworksForUser(int)} is invoked.
233265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius     */
233365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    @Test
233465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    public void testRemoveNetworksForUser() throws Exception {
233565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createOpenNetwork());
233665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createPskNetwork());
233765245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        verifyAddNetworkToWifiConfigManager(WifiConfigurationTestUtil.createWepNetwork());
233865245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
233965245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertFalse(mWifiConfigManager.getConfiguredNetworks().isEmpty());
234065245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
23411fe1065da82165183fa057ddbbd2e33bc5708c1bRobin Lee        assertEquals(3, mWifiConfigManager.removeNetworksForUser(TEST_DEFAULT_USER).size());
234265245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
234365245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        // Ensure all the networks are removed now.
234465245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius        assertTrue(mWifiConfigManager.getConfiguredNetworks().isEmpty());
234565245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius    }
234665245230dda9f9892af4d9b6afe82ae2e46aeb96Roshan Pius
2347b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    /**
2348b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius     * Verifies that the connect choice is removed from all networks when
2349a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#removeNetwork(int, int)} is invoked.
2350b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius     */
2351b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    @Test
2352b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    public void testRemoveNetworkRemovesConnectChoice() throws Exception {
2353b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createOpenNetwork();
2354b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskNetwork();
2355b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createPskNetwork();
2356b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
2357b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
2358b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
2359b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2360b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Set connect choice of network 2 over network 1.
2361b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(
2362b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                mWifiConfigManager.setNetworkConnectChoice(
2363b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                        network1.networkId, network2.configKey(), 78L));
2364b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2365b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        WifiConfiguration retrievedNetwork =
2366b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2367b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertEquals(
2368b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2369b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2370b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2371b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Remove network 3 and ensure that the connect choice on network 1 is not removed.
2372b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(mWifiConfigManager.removeNetwork(network3.networkId, TEST_CREATOR_UID));
2373b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2374b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertEquals(
2375b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2376b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2377b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
2378b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        // Now remove network 2 and ensure that the connect choice on network 1 is removed..
2379b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertTrue(mWifiConfigManager.removeNetwork(network2.networkId, TEST_CREATOR_UID));
2380b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(network1.networkId);
2381b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius        assertNotEquals(
2382b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                network2.configKey(),
2383b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getConnectChoice());
2384cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius
2385cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        // This should have triggered 2 buffered writes. 1 for setting the connect choice, 1 for
2386cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        // clearing it after network removal.
2387cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, times(2))
2388cdd9c486c7c3282ba95f4b52c68457b4ff12e93fRoshan Pius                .write(eq(false), any(WifiConfigStoreData.class));
2389b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius    }
2390b44c61bbdad7d973af94566172c99eb4ec502783Roshan Pius
23910f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    /**
23920f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * Verifies that the modification of a single network using
23930f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} and ensures that any
23940f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * updates to the network config in
23950f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * {@link WifiKeyStore#updateNetworkKeys(WifiConfiguration, WifiConfiguration)} is reflected
23960f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     * in the internal database.
23970f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius     */
23980f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    @Test
23990f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    public void testUpdateSingleNetworkWithKeysUpdate() {
24000f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfiguration network = WifiConfigurationTestUtil.createEapNetwork();
24010f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        network.enterpriseConfig =
24020f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                WifiConfigurationTestUtil.createPEAPWifiEnterpriseConfigWithGTCPhase2();
24030f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
24040f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
24050f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Now verify that network configurations match before we make any change.
24060f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
24070f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                network,
24080f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
24090f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
24100f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Modify the network ca_cert field in updateNetworkKeys method during a network
24110f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // config update.
24120f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        final String newCaCertAlias = "test";
24130f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        assertNotEquals(newCaCertAlias, network.enterpriseConfig.getCaCertificateAlias());
24140f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
24150f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        doAnswer(new AnswerWithArguments() {
24160f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius            public boolean answer(WifiConfiguration newConfig, WifiConfiguration existingConfig) {
24170f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                newConfig.enterpriseConfig.setCaCertificateAlias(newCaCertAlias);
24180f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                return true;
24190f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius            }
24200f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        }).when(mWifiKeyStore).updateNetworkKeys(
24210f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                any(WifiConfiguration.class), any(WifiConfiguration.class));
24220f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
24230f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
24240f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
24250f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // Now verify that the keys update is reflected in the configuration fetched from internal
24260f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        // db.
24270f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        network.enterpriseConfig.setCaCertificateAlias(newCaCertAlias);
24280f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
24290f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                network,
24300f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(network.networkId));
24310f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius    }
24320f166e9103c4ef46eaa49ad20359ce0db2ef9791Roshan Pius
243342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    /**
243442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     * Verifies that the dump method prints out all the saved network details with passwords masked.
243542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     * {@link WifiConfigManager#dump(FileDescriptor, PrintWriter, String[])}.
243642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius     */
243742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    @Test
243842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    public void testDump() {
243942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        WifiConfiguration pskNetwork = WifiConfigurationTestUtil.createPskNetwork();
244042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        WifiConfiguration eapNetwork = WifiConfigurationTestUtil.createEapNetwork();
244142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        eapNetwork.enterpriseConfig.setPassword("blah");
244242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
244342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        verifyAddNetworkToWifiConfigManager(pskNetwork);
244442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        verifyAddNetworkToWifiConfigManager(eapNetwork);
244542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
244642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        StringWriter stringWriter = new StringWriter();
244742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        mWifiConfigManager.dump(
244842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius                new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
244942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        String dumpString = stringWriter.toString();
245042ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
245142ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        // Ensure that the network SSIDs were dumped out.
245242ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertTrue(dumpString.contains(pskNetwork.SSID));
245342ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertTrue(dumpString.contains(eapNetwork.SSID));
245442ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
245542ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        // Ensure that the network passwords were not dumped out.
245642ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertFalse(dumpString.contains(pskNetwork.preSharedKey));
245742ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius        assertFalse(dumpString.contains(eapNetwork.enterpriseConfig.getPassword()));
245842ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius    }
245942ed8f87e72cdf7780dc3cc87da751253a6d74edRoshan Pius
24605c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    /**
24615c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     * Verifies the ordering of network list generated using
24625c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     * {@link WifiConfigManager#retrieveHiddenNetworkList()}.
24635c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius     */
24645c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    @Test
24655c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    public void testRetrieveHiddenList() {
24665c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Create and add 3 networks.
24675c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network1 = WifiConfigurationTestUtil.createWepHiddenNetwork();
24685c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network2 = WifiConfigurationTestUtil.createPskHiddenNetwork();
24695c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        WifiConfiguration network3 = WifiConfigurationTestUtil.createOpenHiddenNetwork();
24705c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network1);
24715c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network2);
24725c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        verifyAddNetworkToWifiConfigManager(network3);
24735c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
24745c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Enable all of them.
24755c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network1.networkId, false, TEST_CREATOR_UID));
24765c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network2.networkId, false, TEST_CREATOR_UID));
24775c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.enableNetwork(network3.networkId, false, TEST_CREATOR_UID));
24785c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
24795c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now set scan results in 2 of them to set the corresponding
24805c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // {@link NetworkSelectionStatus#mSeenInLastQualifiedNetworkSelection} field.
24815c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
24825c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                network1.networkId, createScanDetailForNetwork(network1).getScanResult(), 54));
24835c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.setNetworkCandidateScanResult(
24845c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                network3.networkId, createScanDetailForNetwork(network3).getScanResult(), 54));
24855c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
24865c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now increment |network3|'s association count. This should ensure that this network
24875c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // is preferred over |network1|.
24885c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(network3.networkId));
24895c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
24905c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Retrieve the hidden network list & verify the order of the networks returned.
24915c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        List<WifiScanner.ScanSettings.HiddenNetwork> hiddenNetworks =
24925c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius                mWifiConfigManager.retrieveHiddenNetworkList();
24935c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(3, hiddenNetworks.size());
24945c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network3.SSID, hiddenNetworks.get(0).ssid);
24955c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network1.SSID, hiddenNetworks.get(1).ssid);
24965c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network2.SSID, hiddenNetworks.get(2).ssid);
24975c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
24985c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Now permanently disable |network3|. This should remove network 3 from the list.
24995c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertTrue(mWifiConfigManager.disableNetwork(network3.networkId, TEST_CREATOR_UID));
25005c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
25015c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        // Retrieve the hidden network list again & verify the order of the networks returned.
25025c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        hiddenNetworks = mWifiConfigManager.retrieveHiddenNetworkList();
25035c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(2, hiddenNetworks.size());
25045c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network1.SSID, hiddenNetworks.get(0).ssid);
25055c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius        assertEquals(network2.SSID, hiddenNetworks.get(1).ssid);
25065c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius    }
25075c6da02cf7736d4ba9fc388151177f5277464c89Roshan Pius
25085c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    /**
25095c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * Verifies the addition of network configurations using
25105c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with same SSID and
25115c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * default key mgmt does not add duplicate network configs.
25125c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     */
25135c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    @Test
25145c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    public void testAddMultipleNetworksWithSameSSIDAndDefaultKeyMgmt() {
25155c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        final String ssid = "test_blah";
25165c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Add a network with the above SSID and default key mgmt and ensure it was added
25175c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // successfully.
25185c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network1 = new WifiConfiguration();
25195c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.SSID = ssid;
25205c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network1);
25215c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
25225c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
25235c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25245c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> retrievedNetworks =
25255c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
25265c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
25275c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
25285c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network1, retrievedNetworks.get(0));
25295c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25305c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Now add a second network with the same SSID and default key mgmt and ensure that it
25315c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // didn't add a new duplicate network.
25325c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network2 = new WifiConfiguration();
25335c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.SSID = ssid;
25345c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        result = addNetworkToWifiConfigManager(network2);
25355c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
25365c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertFalse(result.isNewNetwork());
25375c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25385c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
25395c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
25405c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
25415c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network2, retrievedNetworks.get(0));
25425c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    }
25435c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25445c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    /**
25455c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * Verifies the addition of network configurations using
25465c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * {@link WifiConfigManager#addOrUpdateNetwork(WifiConfiguration, int)} with same SSID and
25475c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     * different key mgmt should add different network configs.
25485c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius     */
25495c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    @Test
25505c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    public void testAddMultipleNetworksWithSameSSIDAndDifferentKeyMgmt() {
25515c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        final String ssid = "test_blah";
25525c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Add a network with the above SSID and WPA_PSK key mgmt and ensure it was added
25535c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // successfully.
25545c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network1 = new WifiConfiguration();
25555c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.SSID = ssid;
25565c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network1.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
25575c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(network1);
25585c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
25595c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
25605c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25615c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> retrievedNetworks =
25625c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                mWifiConfigManager.getConfiguredNetworksWithPasswords();
25635c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(1, retrievedNetworks.size());
25645c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
25655c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                network1, retrievedNetworks.get(0));
25665c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25675c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // Now add a second network with the same SSID and NONE key mgmt and ensure that it
25685c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        // does add a new network.
25695c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfiguration network2 = new WifiConfiguration();
25705c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.SSID = ssid;
25715c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        network2.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
25725c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        result = addNetworkToWifiConfigManager(network2);
25735c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
25745c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertTrue(result.isNewNetwork());
25755c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25765c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        retrievedNetworks = mWifiConfigManager.getConfiguredNetworksWithPasswords();
25775c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        assertEquals(2, retrievedNetworks.size());
25785c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        List<WifiConfiguration> networks = Arrays.asList(network1, network2);
25795c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius        WifiConfigurationTestUtil.assertConfigurationsEqualForConfigManagerAddOrUpdate(
25805c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius                networks, retrievedNetworks);
25815c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius    }
25825c96fb2af01e2db3060aab970891355fa63542fdRoshan Pius
25830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
25840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a proxy, without having permission OVERRIDE_WIFI_CONFIG,
25850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * holding device policy, or profile owner policy fails.
25860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
25870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
25880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyFails() {
25890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
25900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
25910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
25920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
25930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
25940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
25950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
25960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
25970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
25980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
25990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
26010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
26020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
26040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
26050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
26060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a PAC or STATIC proxy with permission
26070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * OVERRIDE_WIFI_CONFIG is successful
26080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
26090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
26100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyWithConfOverride() {
26110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true,  // withConfOverride
26130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
26140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
26160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
26170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true,  // withConfOverride
26200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
26210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
26230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
26240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
26260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
26270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
26280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a PAC or STATIC proxy, while holding policy
26290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER} is successful
26300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
26310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
26320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyAsProfileOwner() {
26330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
26350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
26360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
26380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
26390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
26420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
26430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
26450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
26460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
26480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
26490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that adding a network with a PAC or STATIC proxy, while holding policy
26500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER} is successful
26510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
26520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
26530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testAddNetworkWithProxyAsDeviceOwner() {
26540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
26560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
26570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
26580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
26590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
26600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false,  // withConfOverride
26630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
26640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
26650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
26660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
26670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
26680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
26690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
26700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network (that has no proxy) and adding a PAC or STATIC proxy fails
26710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * without being able to override configs, or holding Device or Profile owner policies.
26720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
26730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
26740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkAddProxyFails() {
26750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        WifiConfiguration network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
26760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network);
26770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
26790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
26800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
26820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
26830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
26840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
26850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
26860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
26870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
26880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithStaticProxy(),
26890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
26900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
26910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
26920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
26930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network and adding a proxy is successful in the cases where app can
26940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * override configs, holds policy {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER},
26950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * and holds policy {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER}, and that it fails
26960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * otherwise.
26970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
26980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
26990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkAddProxyWithPermissionAndSystem() {
27000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Testing updating network with uid permission OVERRIDE_WIFI_CONFIG
27010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        WifiConfiguration network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
27020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result =
27030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                mWifiConfigManager.addOrUpdateNetwork(network, TEST_CREATOR_UID);
27040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
27050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
27070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
27080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
27090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
27100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
27110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
27120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
27130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Testing updating network with proxy while holding Profile Owner policy
27140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
27150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = mWifiConfigManager.addOrUpdateNetwork(network, TEST_NO_PERM_UID);
27160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
27170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
27190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
27200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
27210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
27220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
27230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
27240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
27250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Testing updating network with proxy while holding Device Owner Policy
27260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
27270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = mWifiConfigManager.addOrUpdateNetwork(network, TEST_NO_PERM_UID);
27280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
27290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
27310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
27320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
27330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy(),
27340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
27350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
27360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
27370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
27380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
27390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network that has a proxy without changing the proxy, can succeed
27400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * without proxy specific permissions.
27410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
27420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
27430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkUnchangedProxy() {
27440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf = WifiConfigurationTestUtil.createDHCPIpConfigurationWithPacProxy();
27450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // First create a WifiConfiguration with proxy
27460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withConfOverride
27480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        true, // withProfileOwnerPolicy
27490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withDeviceOwnerPolicy
27500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        ipConf,
27510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        true, // assertSuccess
27520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
27530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update the network while using the same ipConf, and no proxy specific permissions
27540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withConfOverride
27560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withProfileOwnerPolicy
27570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        false, // withDeviceOwnerPolicy
27580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        ipConf,
27590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        true, // assertSuccess
27600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        result.getNetworkId()); // Update networkID
27610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
27620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
27630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
27640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network with a different proxy succeeds in the cases where app can
27650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * override configs, holds policy {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER},
27660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * and holds policy {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER}, and that it fails
27670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * otherwise.
27680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
27690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
27700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkDifferentProxy() {
27710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Create two proxy configurations of the same type, but different values
27720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf1 =
27730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
27740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.STATIC_PROXY_SETTING,
27750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_1,
27760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_1,
27770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_1,
27780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_1);
27790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf2 =
27800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
27810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.STATIC_PROXY_SETTING,
27820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_2,
27830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_2,
27840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_2,
27850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_2);
27860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
27870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with Conf Override
27880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
27900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
27910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
27920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
27930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
27940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
27950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
27960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
27970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
27980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
27990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
28000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
28020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
28030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Device Owner
28040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
28080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
28090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
28150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
28160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
28180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
28190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Profile Owner
28200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
28230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
28250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
28300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
28320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
28340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
28350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with no permissions (should fail)
28360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
28390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
28410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
28480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
28490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
28500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
28510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    /**
28520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * Verifies that updating a network removing its proxy succeeds in the cases where app can
28530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * override configs, holds policy {@link DeviceAdminInfo.USES_POLICY_PROFILE_OWNER},
28540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * and holds policy {@link DeviceAdminInfo.USES_POLICY_DEVICE_OWNER}, and that it fails
28550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     * otherwise.
28560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne     */
28570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    @Test
28580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    public void testUpdateNetworkRemoveProxy() {
28590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Create two different IP configurations, one with a proxy and another without.
28600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf1 =
28610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
28620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.STATIC_PROXY_SETTING,
28630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_1,
28640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_1,
28650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_1,
28660d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_1);
28670d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        IpConfiguration ipConf2 =
28680d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfigurationTestUtil.createDHCPIpConfigurationWithSpecificProxy(
28690d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        WifiConfigurationTestUtil.NONE_PROXY_SETTING,
28700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_HOST_2,
28710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_PORT_2,
28720d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_STATIC_PROXY_EXCLUSION_LIST_2,
28730d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        TEST_PAC_PROXY_LOCATION_2);
28740d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
28750d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with Conf Override
28760d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28770d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
28780d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28790d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28800d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
28810d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28820d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28830d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28840d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withConfOverride
28850d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28860d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
28870d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
28880d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28890d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
28900d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
28910d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Device Owner
28920d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
28930d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
28940d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
28950d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
28960d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
28970d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
28980d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
28990d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29000d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29010d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29020d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withDeviceOwnerPolicy
29030d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
29040d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29050d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
29060d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
29070d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update as Profile Owner
29080d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29090d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29100d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
29110d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29120d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
29130d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29140d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29150d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29160d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29170d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
29180d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29190d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
29200d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29210d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
29220d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
29230d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        // Update with no permissions (should fail)
29240d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        result = verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29250d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29260d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // withProfileOwnerPolicy
29270d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29280d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf1,
29290d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                true, // assertSuccess
29300d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                WifiConfiguration.INVALID_NETWORK_ID); // Update networkID
29310d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29320d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withConfOverride
29330d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withProfileOwnerPolicy
29340d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // withDeviceOwnerPolicy
29350d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                ipConf2,
29360d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                false, // assertSuccess
29370d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                result.getNetworkId()); // Update networkID
29380d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
29390d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
29400d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    private NetworkUpdateResult verifyAddOrUpdateNetworkWithProxySettingsAndPermissions(
29410d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean withConfOverride,
29420d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean withProfileOwnerPolicy,
29430d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean withDeviceOwnerPolicy,
29440d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            IpConfiguration ipConfiguration,
29450d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            boolean assertSuccess,
29460d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            int networkId) {
29470d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        WifiConfiguration network;
29480d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        if (networkId == WifiConfiguration.INVALID_NETWORK_ID) {
29490d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            network = WifiConfigurationTestUtil.createOpenHiddenNetwork();
29500d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        } else {
29510d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne            network = mWifiConfigManager.getConfiguredNetwork(networkId);
29520d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        }
29530d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        network.setIpConfiguration(ipConfiguration);
29540d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
29550d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_PROFILE_OWNER)))
29560d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(withProfileOwnerPolicy);
29570d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        when(mDevicePolicyManagerInternal.isActiveAdminWithPolicy(anyInt(),
29580d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                eq(DeviceAdminInfo.USES_POLICY_DEVICE_OWNER)))
29590d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                .thenReturn(withDeviceOwnerPolicy);
29600d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        int uid = withConfOverride ? TEST_CREATOR_UID : TEST_NO_PERM_UID;
29610d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        NetworkUpdateResult result = mWifiConfigManager.addOrUpdateNetwork(network, uid);
29620d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        assertEquals(assertSuccess, result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
29630d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne        return result;
29640d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne    }
29650d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne
29662dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private void createWifiConfigManager() {
29672dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mWifiConfigManager =
2968a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                new WifiConfigManager(
296996241bee619ff7073635f680a36869f61a11a225Roshan Pius                        mContext, mFrameworkFacade, mClock, mUserManager, mTelephonyManager,
29700d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        mWifiKeyStore, mWifiConfigStore, mWifiConfigStoreLegacy,
29710d14dbc1da819e72054b9f168c8e3db767dd34bfGlen Kuhne                        mWifiPermissionsWrapper);
29722dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        mWifiConfigManager.enableVerboseLogging(1);
29732dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
29742dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
29758600bb5b23872d2f67cf7a12c3d8c40c5f990e84Roshan Pius    /**
297650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * This method sets defaults in the provided WifiConfiguration object if not set
297750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * so that it can be used for comparison with the configuration retrieved from
297850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * WifiConfigManager.
297950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
298050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setDefaults(WifiConfiguration configuration) {
298150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedAuthAlgorithms.isEmpty()) {
298250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
298350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
298450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedProtocols.isEmpty()) {
298550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
298650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
298750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
298850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedKeyManagement.isEmpty()) {
298950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
299050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_EAP);
299150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
299250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedPairwiseCiphers.isEmpty()) {
299350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
299450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
299550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
299650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.allowedGroupCiphers.isEmpty()) {
299750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
299850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
299950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
300050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
300150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
300250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.getIpAssignment() == IpConfiguration.IpAssignment.UNASSIGNED) {
300350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
300450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
300550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        if (configuration.getProxySettings() == IpConfiguration.ProxySettings.UNASSIGNED) {
300650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            configuration.setProxySettings(IpConfiguration.ProxySettings.NONE);
300750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        }
30080ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        configuration.status = WifiConfiguration.Status.DISABLED;
30090ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius        configuration.getNetworkSelectionStatus().setNetworkSelectionStatus(
30100ce3ad57f3ce7fcfab17930e8cd48e6da57006fbRoshan Pius                NetworkSelectionStatus.NETWORK_SELECTION_PERMANENTLY_DISABLED);
301150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
301250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
301350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
301450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided configuration with creator uid, package name
301550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * and time.
301650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
301750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setCreationDebugParams(WifiConfiguration configuration) {
301850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creatorUid = configuration.lastUpdateUid = TEST_CREATOR_UID;
301950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creatorName = configuration.lastUpdateName = TEST_CREATOR_NAME;
302050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.creationTime = configuration.updateTime =
3021a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.createDebugTimeStampString(
302250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                        TEST_WALLCLOCK_CREATION_TIME_MILLIS);
302350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
302450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
302550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
302650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided configuration with update uid, package name
302750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * and time.
302850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
302950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void setUpdateDebugParams(WifiConfiguration configuration) {
303050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.lastUpdateUid = TEST_UPDATE_UID;
303150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.lastUpdateName = TEST_UPDATE_NAME;
303250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.updateTime =
3033a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.createDebugTimeStampString(TEST_WALLCLOCK_UPDATE_TIME_MILLIS);
303450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
303550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
30361fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertNotEquals(Object expected, Object actual) {
30371fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        if (actual != null) {
30381fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            assertFalse(actual.equals(expected));
30391fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        } else {
30401fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            assertNotNull(expected);
30411fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        }
30421fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
30431fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
304450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
304550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided WifiConfiguration with the specified bssid value. Also, asserts that
304650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * the existing |BSSID| field is not the same value as the one being set
304750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
304850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void assertAndSetNetworkBSSID(WifiConfiguration configuration, String bssid) {
30491fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(bssid, configuration.BSSID);
305050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.BSSID = bssid;
305150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
305250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
305350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
305450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Modifies the provided WifiConfiguration with the specified |IpConfiguration| object. Also,
30551fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * asserts that the existing |mIpConfiguration| field is not the same value as the one being set
305650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
305750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private void assertAndSetNetworkIpConfiguration(
305850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius            WifiConfiguration configuration, IpConfiguration ipConfiguration) {
30591fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(ipConfiguration, configuration.getIpConfiguration());
306050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        configuration.setIpConfiguration(ipConfiguration);
306150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
306250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
306350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
30641fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified |wepKeys| value and
30651fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * |wepTxKeyIndex|.
30661fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
30671fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkWepKeysAndTxIndex(
30681fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String[] wepKeys, int wepTxKeyIdx) {
30691fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(wepKeys, configuration.wepKeys);
30701fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(wepTxKeyIdx, configuration.wepTxKeyIndex);
30711fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.wepKeys = Arrays.copyOf(wepKeys, wepKeys.length);
30721fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.wepTxKeyIndex = wepTxKeyIdx;
30731fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
30741fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
30751fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
30761fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified |preSharedKey| value.
30771fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
30781fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkPreSharedKey(
30791fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String preSharedKey) {
30801fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(preSharedKey, configuration.preSharedKey);
30811fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.preSharedKey = preSharedKey;
30821fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
30831fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
30841fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
30851fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     * Modifies the provided WifiConfiguration with the specified enteprise |password| value.
30861fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius     */
30871fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    private void assertAndSetNetworkEnterprisePassword(
30881fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius            WifiConfiguration configuration, String password) {
30891fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        assertNotEquals(password, configuration.enterpriseConfig.getPassword());
30901fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius        configuration.enterpriseConfig.setPassword(password);
30911fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    }
30921fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius
30931fa858ae90e82658e2d5332f66c62c671e736bfbRoshan Pius    /**
3094c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Helper method to capture the store data written in WifiConfigStore.write() method.
30956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
3096c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private WifiConfigStoreData captureWriteStoreData() {
30976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        try {
30986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            ArgumentCaptor<WifiConfigStoreData> storeDataCaptor =
30996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    ArgumentCaptor.forClass(WifiConfigStoreData.class);
31006e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            mContextConfigStoreMockOrder.verify(mWifiConfigStore)
31016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    .write(anyBoolean(), storeDataCaptor.capture());
3102c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            return storeDataCaptor.getValue();
31036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        } catch (Exception e) {
31046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            fail("Exception encountered during write " + e);
31056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
3106c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        return null;
3107c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
3108c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
3109c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
3110c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Returns whether the provided network was in the store data or not.
3111c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
3112c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private boolean isNetworkInConfigStoreData(WifiConfiguration configuration) {
3113c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        WifiConfigStoreData storeData = captureWriteStoreData();
3114c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        if (storeData == null) {
3115c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            return false;
3116c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        }
3117bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        return isNetworkInConfigStoreData(configuration, storeData);
3118bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
3119bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
3120bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
3121bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Returns whether the provided network was in the store data or not.
3122bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
3123bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    private boolean isNetworkInConfigStoreData(
3124bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius            WifiConfiguration configuration, WifiConfigStoreData storeData) {
3125c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        boolean foundNetworkInStoreData = false;
3126c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        for (WifiConfiguration retrievedConfig : storeData.getConfigurations()) {
3127c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            if (retrievedConfig.configKey().equals(configuration.configKey())) {
3128c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                foundNetworkInStoreData = true;
3129bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius                break;
3130c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius            }
3131c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        }
3132c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        return foundNetworkInStoreData;
31336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
31346e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31356e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
31366e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the provided network was not present in the last config store write.
31376e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
31386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkNotInConfigStoreData(WifiConfiguration configuration) {
31396e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(isNetworkInConfigStoreData(configuration));
31406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
31416e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
31436e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the provided network was present in the last config store write.
31446e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
31456e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkInConfigStoreData(WifiConfiguration configuration) {
31466e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(isNetworkInConfigStoreData(configuration));
31476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
31486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void assertPasswordsMaskedInWifiConfiguration(WifiConfiguration configuration) {
315022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (!TextUtils.isEmpty(configuration.preSharedKey)) {
3151a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius            assertEquals(WifiConfigManager.PASSWORD_MASK, configuration.preSharedKey);
31526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
31536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        if (configuration.wepKeys != null) {
31546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            for (int i = 0; i < configuration.wepKeys.length; i++) {
31556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                if (!TextUtils.isEmpty(configuration.wepKeys[i])) {
3156a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    assertEquals(WifiConfigManager.PASSWORD_MASK, configuration.wepKeys[i]);
31576e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                }
31586e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            }
31596e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
316022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (!TextUtils.isEmpty(configuration.enterpriseConfig.getPassword())) {
31616e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            assertEquals(
3162a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                    WifiConfigManager.PASSWORD_MASK,
31636e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                    configuration.enterpriseConfig.getPassword());
31646e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        }
31656e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
31666e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31676e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
31686e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that the network was present in the network change broadcast and returns the
31696e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * change reason.
31706e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
31716e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private int verifyNetworkInBroadcastAndReturnReason(WifiConfiguration configuration) {
31726e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
31736e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        ArgumentCaptor<UserHandle> userHandleCaptor = ArgumentCaptor.forClass(UserHandle.class);
31746e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        mContextConfigStoreMockOrder.verify(mContext)
31756e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                .sendBroadcastAsUser(intentCaptor.capture(), userHandleCaptor.capture());
31766e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31776e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(userHandleCaptor.getValue(), UserHandle.ALL);
31786e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        Intent intent = intentCaptor.getValue();
31796e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31806e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        int changeReason = intent.getIntExtra(WifiManager.EXTRA_CHANGE_REASON, -1);
31816e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        WifiConfiguration retrievedConfig =
31826e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                (WifiConfiguration) intent.getExtra(WifiManager.EXTRA_WIFI_CONFIGURATION);
31836e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(retrievedConfig.configKey(), configuration.configKey());
31846e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that all the passwords are masked in the broadcast configuration.
31866e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertPasswordsMaskedInWifiConfiguration(retrievedConfig);
31876e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31886e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return changeReason;
31896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
31906e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
31916e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
31926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out an add broadcast with the provided network.
31936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
31946e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkAddBroadcast(WifiConfiguration configuration) {
31956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
31966e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
31976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_ADDED);
31986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
31996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32006e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
32016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out an update broadcast with the provided network.
32026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
32036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkUpdateBroadcast(WifiConfiguration configuration) {
32046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
32056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
32066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_CONFIG_CHANGE);
32076e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
32086e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
32106e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Verifies that we sent out a remove broadcast with the provided network.
32116e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
32126e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private void verifyNetworkRemoveBroadcast(WifiConfiguration configuration) {
32136e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertEquals(
32146e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                verifyNetworkInBroadcastAndReturnReason(configuration),
32156e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius                WifiManager.CHANGE_REASON_REMOVED);
32166e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
32176e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
321950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Adds the provided configuration to WifiConfigManager and modifies the provided configuration
322050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * with creator/update uid, package name and time. This also sets defaults for fields not
322150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * populated.
322250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * These fields are populated internally by WifiConfigManager and hence we need
322350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * to modify the configuration before we compare the added network with the retrieved network.
322450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
322550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private NetworkUpdateResult addNetworkToWifiConfigManager(WifiConfiguration configuration) {
322650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_CREATION_TIME_MILLIS);
322750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        NetworkUpdateResult result =
322850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(configuration, TEST_CREATOR_UID);
322950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setDefaults(configuration);
323050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setCreationDebugParams(configuration);
32316e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        configuration.networkId = result.getNetworkId();
32326e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
32336e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
32346e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32356e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
32366e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Add network to WifiConfigManager and ensure that it was successful.
32376e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
32386e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyAddNetworkToWifiConfigManager(
32396e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
32406e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
32416e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
32426e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.isNewNetwork());
32436e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
32446e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
32456e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32466e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkAddBroadcast(configuration);
32476e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that the config store write was triggered with this new configuration.
32486e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkInConfigStoreData(configuration);
32496e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
32506e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
32516e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32526e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
32536e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Add ephemeral network to WifiConfigManager and ensure that it was successful.
32546e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
32556e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyAddEphemeralNetworkToWifiConfigManager(
3256bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius            WifiConfiguration configuration) throws Exception {
32576e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = addNetworkToWifiConfigManager(configuration);
32586e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
32596e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.isNewNetwork());
32606e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
32616e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
32626e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32636e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkAddBroadcast(configuration);
3264bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that the write was not invoked for ephemeral network addition.
3265bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
3266bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius                .write(anyBoolean(), any(WifiConfigStoreData.class));
326750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        return result;
326850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
326950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius
327050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    /**
327150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * Updates the provided configuration to WifiConfigManager and modifies the provided
327250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * configuration with update uid, package name and time.
327350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * These fields are populated internally by WifiConfigManager and hence we need
327450eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     * to modify the configuration before we compare the added network with the retrieved network.
327550eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius     */
327650eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    private NetworkUpdateResult updateNetworkToWifiConfigManager(WifiConfiguration configuration) {
327750eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        when(mClock.getWallClockMillis()).thenReturn(TEST_WALLCLOCK_UPDATE_TIME_MILLIS);
327850eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        NetworkUpdateResult result =
327950eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius                mWifiConfigManager.addOrUpdateNetwork(configuration, TEST_UPDATE_UID);
328050eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        setUpdateDebugParams(configuration);
328150eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius        return result;
328250eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius    }
32836e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32846e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
32856e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager config change and ensure that it was successful.
32866e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
32876e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManager(
32886e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
32896e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = updateNetworkToWifiConfigManager(configuration);
32906e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.getNetworkId() != WifiConfiguration.INVALID_NETWORK_ID);
32916e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.isNewNetwork());
32926e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32936e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkUpdateBroadcast(configuration);
32946e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        // Verify that the config store write was triggered with this new configuration.
32956e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        verifyNetworkInConfigStoreData(configuration);
32966e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
32976e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
32986e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
32996e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
33006e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager without IP config change and ensure that it was
33016e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * successful.
33026e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
33036e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(
33046e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
33056e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManager(configuration);
33066e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.hasIpChanged());
33076e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertFalse(result.hasProxyChanged());
33086e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
33096e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
33106e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius
33116e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    /**
33126e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * Update network to WifiConfigManager with IP config change and ensure that it was
33136e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     * successful.
33146e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius     */
33156e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    private NetworkUpdateResult verifyUpdateNetworkToWifiConfigManagerWithIpChange(
33166e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius            WifiConfiguration configuration) {
33176e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManager(configuration);
33186e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasIpChanged());
33196e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        assertTrue(result.hasProxyChanged());
33206e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius        return result;
33216e2780943dc04aae2e6b0fc7890d660f25e7e5fcRoshan Pius    }
3322c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
3323c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    /**
3324c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     * Removes network from WifiConfigManager and ensure that it was successful.
3325c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius     */
3326c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    private void verifyRemoveNetworkFromWifiConfigManager(
3327c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius            WifiConfiguration configuration) {
33286d9904fdafe96b09babe5b2ec2b90557e75ce94cRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID));
3329c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius
3330c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyNetworkRemoveBroadcast(configuration);
3331c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        // Verify if the config store write was triggered without this new configuration.
3332c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius        verifyNetworkNotInConfigStoreData(configuration);
3333c7c6121f6d864aeb4cec065a586229d3be352b43Roshan Pius    }
3334fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3335fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
3336bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     * Removes ephemeral network from WifiConfigManager and ensure that it was successful.
3337bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius     */
3338bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    private void verifyRemoveEphemeralNetworkFromWifiConfigManager(
33392ce074c7dfa6f99812f67cad3c1a98a6edd36028Roshan Pius            WifiConfiguration configuration) throws Exception {
3340bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        assertTrue(mWifiConfigManager.removeNetwork(configuration.networkId, TEST_CREATOR_UID));
3341bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
3342bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        verifyNetworkRemoveBroadcast(configuration);
3343bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        // Ensure that the write was not invoked for ephemeral network remove.
3344bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius        mContextConfigStoreMockOrder.verify(mWifiConfigStore, never())
3345bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius                .write(anyBoolean(), any(WifiConfigStoreData.class));
3346bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    }
3347bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius
3348bbf3b21e42e6f13bddd1c30e4266b5be0d1404beRoshan Pius    /**
3349fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the provided network's public status and ensures that the network change broadcast
3350fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * has been sent out.
3351fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
3352fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private void verifyUpdateNetworkStatus(WifiConfiguration configuration, int status) {
3353fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertEquals(status, configuration.status);
3354fc789b2227e92372b2489ca54691310800835a50Roshan Pius        verifyNetworkUpdateBroadcast(configuration);
3355fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
3356fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3357fc789b2227e92372b2489ca54691310800835a50Roshan Pius    /**
3358fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * Verifies the network's selection status update.
3359fc789b2227e92372b2489ca54691310800835a50Roshan Pius     *
3360fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * For temporarily disabled reasons, the method ensures that the status has changed only if
3361fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * disable reason counter has exceeded the threshold.
3362fc789b2227e92372b2489ca54691310800835a50Roshan Pius     *
3363fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * For permanently disabled/enabled reasons, the method ensures that the public status has
3364fc789b2227e92372b2489ca54691310800835a50Roshan Pius     * changed and the network change broadcast has been sent out.
3365fc789b2227e92372b2489ca54691310800835a50Roshan Pius     */
3366fc789b2227e92372b2489ca54691310800835a50Roshan Pius    private void verifyUpdateNetworkSelectionStatus(
3367fc789b2227e92372b2489ca54691310800835a50Roshan Pius            int networkId, int reason, int temporaryDisableReasonCounter) {
3368fc789b2227e92372b2489ca54691310800835a50Roshan Pius        when(mClock.getElapsedSinceBootMillis())
3369fc789b2227e92372b2489ca54691310800835a50Roshan Pius                .thenReturn(TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS);
3370fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3371fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Fetch the current status of the network before we try to update the status.
3372fc789b2227e92372b2489ca54691310800835a50Roshan Pius        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
3373fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus currentStatus = retrievedNetwork.getNetworkSelectionStatus();
3374fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int currentDisableReason = currentStatus.getNetworkSelectionDisableReason();
3375fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3376fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // First set the status to the provided reason.
3377fc789b2227e92372b2489ca54691310800835a50Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkSelectionStatus(networkId, reason));
3378fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3379fc789b2227e92372b2489ca54691310800835a50Roshan Pius        // Now fetch the network configuration and verify the new status of the network.
3380fc789b2227e92372b2489ca54691310800835a50Roshan Pius        retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
3381fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3382fc789b2227e92372b2489ca54691310800835a50Roshan Pius        NetworkSelectionStatus retrievedStatus = retrievedNetwork.getNetworkSelectionStatus();
3383fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int retrievedDisableReason = retrievedStatus.getNetworkSelectionDisableReason();
3384fc789b2227e92372b2489ca54691310800835a50Roshan Pius        long retrievedDisableTime = retrievedStatus.getDisableTime();
3385fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int retrievedDisableReasonCounter = retrievedStatus.getDisableReasonCounter(reason);
3386fc789b2227e92372b2489ca54691310800835a50Roshan Pius        int disableReasonThreshold =
3387a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius                WifiConfigManager.NETWORK_SELECTION_DISABLE_THRESHOLD[reason];
3388fc789b2227e92372b2489ca54691310800835a50Roshan Pius
3389fc789b2227e92372b2489ca54691310800835a50Roshan Pius        if (reason == NetworkSelectionStatus.NETWORK_SELECTION_ENABLE) {
3390fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(reason, retrievedDisableReason);
3391fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertTrue(retrievedStatus.isNetworkEnabled());
3392fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(
3393fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    NetworkSelectionStatus.INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP,
3394fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    retrievedDisableTime);
3395fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.ENABLED);
3396fc789b2227e92372b2489ca54691310800835a50Roshan Pius        } else if (reason < NetworkSelectionStatus.DISABLED_TLS_VERSION_MISMATCH) {
3397fc789b2227e92372b2489ca54691310800835a50Roshan Pius            // For temporarily disabled networks, we need to ensure that the current status remains
3398fc789b2227e92372b2489ca54691310800835a50Roshan Pius            // until the threshold is crossed.
3399fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(temporaryDisableReasonCounter, retrievedDisableReasonCounter);
3400fc789b2227e92372b2489ca54691310800835a50Roshan Pius            if (retrievedDisableReasonCounter < disableReasonThreshold) {
3401fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(currentDisableReason, retrievedDisableReason);
3402fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(
3403fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        currentStatus.getNetworkSelectionStatus(),
3404fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        retrievedStatus.getNetworkSelectionStatus());
3405fc789b2227e92372b2489ca54691310800835a50Roshan Pius            } else {
3406fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(reason, retrievedDisableReason);
3407fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertTrue(retrievedStatus.isNetworkTemporaryDisabled());
3408fc789b2227e92372b2489ca54691310800835a50Roshan Pius                assertEquals(
3409fc789b2227e92372b2489ca54691310800835a50Roshan Pius                        TEST_ELAPSED_UPDATE_NETWORK_SELECTION_TIME_MILLIS, retrievedDisableTime);
3410fc789b2227e92372b2489ca54691310800835a50Roshan Pius            }
3411fc789b2227e92372b2489ca54691310800835a50Roshan Pius        } else if (reason < NetworkSelectionStatus.NETWORK_SELECTION_DISABLED_MAX) {
3412fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(reason, retrievedDisableReason);
3413fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertTrue(retrievedStatus.isNetworkPermanentlyDisabled());
3414fc789b2227e92372b2489ca54691310800835a50Roshan Pius            assertEquals(
3415fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    NetworkSelectionStatus.INVALID_NETWORK_SELECTION_DISABLE_TIMESTAMP,
3416fc789b2227e92372b2489ca54691310800835a50Roshan Pius                    retrievedDisableTime);
3417fc789b2227e92372b2489ca54691310800835a50Roshan Pius            verifyUpdateNetworkStatus(retrievedNetwork, WifiConfiguration.Status.DISABLED);
3418fc789b2227e92372b2489ca54691310800835a50Roshan Pius        }
3419fc789b2227e92372b2489ca54691310800835a50Roshan Pius    }
3420fc789b2227e92372b2489ca54691310800835a50Roshan Pius
342122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
34222dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Creates a scan detail corresponding to the provided network and given BSSID, level &frequency
34232dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * values.
342422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
34252dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private ScanDetail createScanDetailForNetwork(
34262dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius            WifiConfiguration configuration, String bssid, int level, int frequency) {
342722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        String caps;
342822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
342922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WPA2-PSK-CCMP]";
343022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)
343122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                || configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X)) {
343222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WPA2-EAP-CCMP]";
343322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)
343422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                && WifiConfigurationUtil.hasAnyValidWepKey(configuration.wepKeys)) {
343522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[WEP]";
343622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        } else {
343722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            caps = "[]";
343822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        }
343922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiSsid ssid = WifiSsid.createFromAsciiEncoded(configuration.getPrintableSsid());
344022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Fill in 0's in the fields we don't care about.
344122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        return new ScanDetail(
34422dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                ssid, bssid, caps, level, frequency, mClock.getUptimeSinceBootMillis(),
34432dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius                mClock.getWallClockMillis());
34442dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    }
34452dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius
34462dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    /**
34472dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     * Creates a scan detail corresponding to the provided network and BSSID value.
34482dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius     */
34492dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius    private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration, String bssid) {
34502dac6c1d0a510eca1ae2a178fd3423b947196e79Roshan Pius        return createScanDetailForNetwork(configuration, bssid, 0, 0);
345122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
345222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
345322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
345422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Creates a scan detail corresponding to the provided network and fixed BSSID value.
345522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
345622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    private ScanDetail createScanDetailForNetwork(WifiConfiguration configuration) {
345722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        return createScanDetailForNetwork(configuration, TEST_BSSID);
345822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
345922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
346022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    /**
346122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * Adds the provided network and then creates a scan detail corresponding to the network. The
346222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * method then creates a ScanDetail corresponding to the network and ensures that the network
346322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * is properly matched using
3464a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#getSavedNetworkForScanDetailAndCache(ScanDetail)} and also
346522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     * verifies that the provided scan detail was cached,
346622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius     */
346722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    private void verifyAddSingleNetworkAndMatchScanDetailToNetworkAndCache(
346822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius            WifiConfiguration network) {
346922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // First add the provided network.
347022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        verifyAddNetworkToWifiConfigManager(network);
347122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
347222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now create a dummy scan detail corresponding to the network.
347322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetail scanDetail = createScanDetailForNetwork(network);
347422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanResult scanResult = scanDetail.getScanResult();
347522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
347622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfiguration retrievedNetwork =
347722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                mWifiConfigManager.getSavedNetworkForScanDetailAndCache(scanDetail);
3478e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius        // Retrieve the network with password data for comparison.
3479e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius        retrievedNetwork =
3480e3159200aaf7b5d760e7dac4d36cb9a549b76d85Roshan Pius                mWifiConfigManager.getConfiguredNetworkWithPassword(retrievedNetwork.networkId);
348122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
348222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        WifiConfigurationTestUtil.assertConfigurationEqualForConfigManagerAddOrUpdate(
348322b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                network, retrievedNetwork);
348422b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
348522b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        // Now retrieve the scan detail cache and ensure that the new scan detail is in cache.
348622b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanDetailCache retrievedScanDetailCache =
348722b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius                mWifiConfigManager.getScanDetailCacheForNetwork(network.networkId);
348822b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        assertEquals(1, retrievedScanDetailCache.size());
348922b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanResult retrievedScanResult = retrievedScanDetailCache.get(scanResult.BSSID);
349022b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius
349122b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius        ScanTestUtil.assertScanResultEquals(scanResult, retrievedScanResult);
349222b5eca14a99c2bbeeae8361c665923ce71e1603Roshan Pius    }
34932d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
34942d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
34952d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Adds a new network and verifies that the |HasEverConnected| flag is set to false.
34962d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
34972d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyAddNetworkHasEverConnectedFalse(WifiConfiguration network) {
34982d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result = verifyAddNetworkToWifiConfigManager(network);
34992d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
35002d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
35012d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse("Adding a new network should not have hasEverConnected set to true.",
35022d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
35032d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
35042d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
35052d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
35062d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Updates an existing network with some credential change and verifies that the
35072d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * |HasEverConnected| flag is set to false.
35082d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
35092d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyUpdateNetworkWithCredentialChangeHasEverConnectedFalse(
35102d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius            WifiConfiguration network) {
35112d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        NetworkUpdateResult result = verifyUpdateNetworkToWifiConfigManagerWithoutIpChange(network);
35122d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork =
35132d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                mWifiConfigManager.getConfiguredNetwork(result.getNetworkId());
35142d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertFalse("Updating network credentials config should clear hasEverConnected.",
35152d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
35162d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
35172d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
35182d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    /**
35192d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * Updates an existing network after connection using
3520a6eb5e6da171c5426a96a8d0f97c75d1b8a46db0Roshan Pius     * {@link WifiConfigManager#updateNetworkAfterConnect(int)} and asserts that the
35212d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     * |HasEverConnected| flag is set to true.
35222d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius     */
35232d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    private void verifyUpdateNetworkAfterConnectHasEverConnectedTrue(int networkId) {
35242d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue(mWifiConfigManager.updateNetworkAfterConnect(networkId));
35252d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        WifiConfiguration retrievedNetwork = mWifiConfigManager.getConfiguredNetwork(networkId);
35262d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius        assertTrue("hasEverConnected expected to be true after connection.",
35272d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius                retrievedNetwork.getNetworkSelectionStatus().getHasEverConnected());
35282d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius    }
35292d327a58a4d39c7b1b700bf06d2fbbe7fb68c7c4Roshan Pius
3530c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    /**
3531c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * Sets up a user profiles for WifiConfigManager testing.
3532c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     *
3533c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     * @param userId Id of the user.
3534c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius     */
3535c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    private void setupUserProfiles(int userId) {
3536c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        final UserInfo userInfo =
3537c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius                new UserInfo(userId, Integer.toString(userId), UserInfo.FLAG_PRIMARY);
3538c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        List<UserInfo> userProfiles = Arrays.asList(userInfo);
3539c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.getProfiles(userId)).thenReturn(userProfiles);
3540c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius        when(mUserManager.isUserUnlockingOrUnlocked(userId)).thenReturn(true);
3541c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius    }
3542c381d005c60603aadd30581ce675e979b3fec3feRoshan Pius
354350eed92fe9556fdd9934683690181fea77ce4eacRoshan Pius}
3544