1fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski/*
2fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * Copyright (C) 2016 The Android Open Source Project
3fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski *
4fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * Licensed under the Apache License, Version 2.0 (the "License");
5fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * you may not use this file except in compliance with the License.
6fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * You may obtain a copy of the License at
7fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski *
8fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski *      http://www.apache.org/licenses/LICENSE-2.0
9fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski *
10fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * Unless required by applicable law or agreed to in writing, software
11fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * distributed under the License is distributed on an "AS IS" BASIS,
12fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * See the License for the specific language governing permissions and
14fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski * limitations under the License
15fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski */
16fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
17fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskipackage com.android.server.wifi;
18fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
19fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport static org.hamcrest.CoreMatchers.not;
20ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Piusimport static org.junit.Assert.*;
21ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Piusimport static org.mockito.Mockito.*;
22fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
23fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport android.content.Context;
240fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.content.pm.UserInfo;
2578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.net.wifi.FakeKeys;
26fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport android.net.wifi.WifiConfiguration;
2793332917bf29ddbe853a495816e486150f49da40Rebecca Silbersteinimport android.net.wifi.WifiConfiguration.AuthAlgorithm;
2893332917bf29ddbe853a495816e486150f49da40Rebecca Silbersteinimport android.net.wifi.WifiConfiguration.GroupCipher;
2978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.net.wifi.WifiConfiguration.KeyMgmt;
3093332917bf29ddbe853a495816e486150f49da40Rebecca Silbersteinimport android.net.wifi.WifiConfiguration.PairwiseCipher;
3193332917bf29ddbe853a495816e486150f49da40Rebecca Silbersteinimport android.net.wifi.WifiConfiguration.Protocol;
3278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.net.wifi.WifiEnterpriseConfig;
3378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.net.wifi.WifiEnterpriseConfig.Eap;
3478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.net.wifi.WifiEnterpriseConfig.Phase2;
358c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Piusimport android.net.wifi.WifiScanner;
3678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.os.Process;
37bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport android.os.UserHandle;
380fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.os.UserManager;
3978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.security.Credentials;
40ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Piusimport android.security.KeyStore;
41fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Willsimport android.support.test.InstrumentationRegistry;
42fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Willsimport android.test.suitebuilder.annotation.SmallTest;
4378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport android.text.TextUtils;
44ac9ad3283508db15b65b1cbb89b841278973276bRoshan Piusimport android.util.Log;
450fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowskiimport android.util.SparseArray;
46fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
47bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport com.android.server.net.DelayedDiskWrite;
48bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport com.android.server.wifi.MockAnswerUtil.AnswerWithArguments;
492e814680f4dd27a5f825afab189843582235cedcJan Nordqvistimport com.android.server.wifi.hotspot2.omadm.PasspointManagementObjectManager;
50fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport com.android.server.wifi.hotspot2.pps.Credential;
51fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport com.android.server.wifi.hotspot2.pps.HomeSP;
52fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
53fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Willsimport org.junit.Before;
54ac9ad3283508db15b65b1cbb89b841278973276bRoshan Piusimport org.junit.Test;
55fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport org.mockito.Mock;
56fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport org.mockito.MockitoAnnotations;
57fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
58bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.ByteArrayInputStream;
59bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.ByteArrayOutputStream;
60bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.DataInputStream;
61bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.DataOutputStream;
62bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.EOFException;
63bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.File;
64bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.io.FileOutputStream;
6578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport java.io.IOException;
66fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.lang.reflect.Field;
67bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.math.BigInteger;
6878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport java.security.cert.CertificateEncodingException;
6978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport java.security.cert.X509Certificate;
70ac9ad3283508db15b65b1cbb89b841278973276bRoshan Piusimport java.util.ArrayDeque;
71fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.ArrayList;
72bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.util.Arrays;
7378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xuimport java.util.BitSet;
74bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.util.Collection;
75ac9ad3283508db15b65b1cbb89b841278973276bRoshan Piusimport java.util.Collections;
76fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.HashMap;
77fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.HashSet;
78fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.List;
79fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowskiimport java.util.Map;
80ac9ad3283508db15b65b1cbb89b841278973276bRoshan Piusimport java.util.Random;
81bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowskiimport java.util.Set;
82ac9ad3283508db15b65b1cbb89b841278973276bRoshan Piusimport java.util.TreeMap;
83fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
84fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski/**
85c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius * Unit tests for {@link com.android.server.wifi.WifiConfigManager}.
86fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski */
87fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills@SmallTest
88c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Piuspublic class WifiConfigManagerTest {
89bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private static final List<WifiConfiguration> CONFIGS = Arrays.asList(
900fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            WifiConfigurationTestUtil.generateWifiConfig(
91bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    0, 1000000, "\"red\"", true, true, null, null),
920fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            WifiConfigurationTestUtil.generateWifiConfig(
93bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    1, 1000001, "\"green\"", true, true, "example.com", "Green"),
940fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            WifiConfigurationTestUtil.generateWifiConfig(
950fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                    2, 1100000, "\"blue\"", false, true, "example.org", "Blue"),
960fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            WifiConfigurationTestUtil.generateWifiConfig(
970fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                    3, 1200000, "\"cyan\"", false, true, null, null));
98bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
99bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private static final int[] USER_IDS = {0, 10, 11};
1000fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    private static final int MANAGED_PROFILE_USER_ID = 12;
1010fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    private static final int MANAGED_PROFILE_PARENT_USER_ID = 0;
1020fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    private static final SparseArray<List<UserInfo>> USER_PROFILES = new SparseArray<>();
1030fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    static {
1040fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        USER_PROFILES.put(0, Arrays.asList(new UserInfo(0, "Owner", 0),
1050fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                new UserInfo(12, "Managed Profile", 0)));
1060fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        USER_PROFILES.put(10, Arrays.asList(new UserInfo(10, "Alice", 0)));
1070fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        USER_PROFILES.put(11, Arrays.asList(new UserInfo(11, "Bob", 0)));
1080fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    }
1090fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
110bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private static final Map<Integer, List<WifiConfiguration>> VISIBLE_CONFIGS = new HashMap<>();
111bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    static {
112bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (int userId : USER_IDS) {
113bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            List<WifiConfiguration> configs = new ArrayList<>();
114bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (int i = 0; i < CONFIGS.size(); ++i) {
1150fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                if (WifiConfigurationUtil.isVisibleToAnyProfile(CONFIGS.get(i),
1160fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(userId))) {
117bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    configs.add(CONFIGS.get(i));
118bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
119bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
120bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            VISIBLE_CONFIGS.put(userId, configs);
121bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
122bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
123fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
12493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
12593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Set of WifiConfigs for HasEverConnected tests.
12693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
12793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private static final int HAS_EVER_CONNECTED_USER = 20;
12893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private static final WifiConfiguration BASE_HAS_EVER_CONNECTED_CONFIG =
12993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            WifiConfigurationTestUtil.generateWifiConfig(
13093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    0, HAS_EVER_CONNECTED_USER, "testHasEverConnected", false, true, null, null, 0);
13193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
132c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius    public static final String TAG = "WifiConfigManagerTest";
133fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    @Mock private Context mContext;
134fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    @Mock private WifiNative mWifiNative;
135fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    @Mock private FrameworkFacade mFrameworkFacade;
1360fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    @Mock private UserManager mUserManager;
137bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    @Mock private DelayedDiskWrite mWriter;
1382e814680f4dd27a5f825afab189843582235cedcJan Nordqvist    @Mock private PasspointManagementObjectManager mMOManager;
139ae815bc71287f8a85727034c40bb07247a3d9415Vinit Deshpande    @Mock private Clock mClock;
140c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne    private WifiConfigManager mWifiConfigManager;
141bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private ConfigurationMap mConfiguredNetworks;
142c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne    public byte[] mNetworkHistoryBytes;
14378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    private MockKeyStore mMockKeyStore;
144ee0ab818341d44614ffe56ae73ecc08b974c2cbbRoshan Pius    private KeyStore mKeyStore;
145fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
146fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills    /**
147fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills     * Called before each test
148fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills     */
149fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills    @Before
150fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    public void setUp() throws Exception {
151fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        MockitoAnnotations.initMocks(this);
152fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
153fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills        final Context realContext = InstrumentationRegistry.getContext();
154fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mContext.getPackageName()).thenReturn(realContext.getPackageName());
155fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mContext.getResources()).thenReturn(realContext.getResources());
156bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        when(mContext.getPackageManager()).thenReturn(realContext.getPackageManager());
157bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
15806636d2de935ad5d2e8fb6483c406fe922c75ff2Samuel Tan        when(mUserManager.getProfiles(UserHandle.USER_SYSTEM))
1590fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                .thenReturn(USER_PROFILES.get(UserHandle.USER_SYSTEM));
1600fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski
1610fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        for (int userId : USER_IDS) {
1620fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            when(mUserManager.getProfiles(userId)).thenReturn(USER_PROFILES.get(userId));
1630fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        }
164fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
1652d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        mMockKeyStore = new MockKeyStore();
1662d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius
167ac69b83c9cafb9a839b578c3b5b71eb3439244adSamuel Tan        mWifiConfigManager = new WifiConfigManager(mContext, mWifiNative, mFrameworkFacade, mClock,
168ac69b83c9cafb9a839b578c3b5b71eb3439244adSamuel Tan                mUserManager, mMockKeyStore.createMock());
169fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
170bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Field configuredNetworksField =
171c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius                WifiConfigManager.class.getDeclaredField("mConfiguredNetworks");
172bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        configuredNetworksField.setAccessible(true);
173c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        mConfiguredNetworks = (ConfigurationMap) configuredNetworksField.get(mWifiConfigManager);
174bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
175bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Intercept writes to networkHistory.txt.
17679d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills        doAnswer(new AnswerWithArguments() {
177bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            public void answer(String filePath, DelayedDiskWrite.Writer writer) throws Exception {
178bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
179bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final DataOutputStream stream = new DataOutputStream(buffer);
180bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                writer.onWriteCalled(stream);
181bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                stream.close();
182c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                mNetworkHistoryBytes = buffer.toByteArray();
183bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }}).when(mWriter).write(anyString(), (DelayedDiskWrite.Writer) anyObject());
184c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius        final Field writerField = WifiConfigManager.class.getDeclaredField("mWriter");
185bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        writerField.setAccessible(true);
186c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        writerField.set(mWifiConfigManager, mWriter);
187c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        final Field networkHistoryField =
188c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                WifiConfigManager.class.getDeclaredField("mWifiNetworkHistory");
189c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        networkHistoryField.setAccessible(true);
190c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        WifiNetworkHistory wifiNetworkHistory =
191c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                (WifiNetworkHistory) networkHistoryField.get(mWifiConfigManager);
192c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        final Field networkHistoryWriterField =
193c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                WifiNetworkHistory.class.getDeclaredField("mWriter");
194c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        networkHistoryWriterField.setAccessible(true);
195c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        networkHistoryWriterField.set(wifiNetworkHistory, mWriter);
196bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
197fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mMOManager.isEnabled()).thenReturn(true);
198c2a0ff06d58e1cfb9b69fa5b6a8fef5929812f27Roshan Pius        final Field moManagerField = WifiConfigManager.class.getDeclaredField("mMOManager");
199fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        moManagerField.setAccessible(true);
200c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        moManagerField.set(mWifiConfigManager, mMOManager);
201fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    }
202fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
203bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private void switchUser(int newUserId) {
20406636d2de935ad5d2e8fb6483c406fe922c75ff2Samuel Tan        when(mUserManager.getProfiles(newUserId))
2050fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                .thenReturn(USER_PROFILES.get(newUserId));
20606636d2de935ad5d2e8fb6483c406fe922c75ff2Samuel Tan        mWifiConfigManager.handleUserSwitch(newUserId);
207bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
208bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
2090fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski    private void switchUserToCreatorOrParentOf(WifiConfiguration config) {
2100fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        final int creatorUserId = UserHandle.getUserId(config.creatorUid);
2110fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        if (creatorUserId == MANAGED_PROFILE_USER_ID) {
2120fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            switchUser(MANAGED_PROFILE_PARENT_USER_ID);
2130fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        } else {
2140fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            switchUser(creatorUserId);
2150fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        }
216bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
217bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
218bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private void addNetworks() throws Exception {
21993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        for (int i = 0; i < CONFIGS.size(); ++i) {
22093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            assertEquals(i, CONFIGS.get(i).networkId);
22193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            addNetwork(CONFIGS.get(i));
22293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        }
22393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
22493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
22593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private void addNetwork(WifiConfiguration config) throws Exception {
22606636d2de935ad5d2e8fb6483c406fe922c75ff2Samuel Tan        final int originalUserId = mWifiConfigManager.getCurrentUserId();
227bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
228bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        when(mWifiNative.setNetworkVariable(anyInt(), anyString(), anyString())).thenReturn(true);
229bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        when(mWifiNative.setNetworkExtra(anyInt(), anyString(), (Map<String, String>) anyObject()))
230bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                .thenReturn(true);
23193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
23293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(config);
23393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final WifiConfiguration configCopy = new WifiConfiguration(config);
23493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        int networkId = config.networkId;
23593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        config.networkId = -1;
23693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.addNetwork()).thenReturn(networkId);
23793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(networkId, WifiConfiguration.ssidVarName))
23893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .thenReturn(encodeConfigSSID(config));
23993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.saveNetwork(config, configCopy.creatorUid);
240bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
241bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        switchUser(originalUserId);
242bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
243bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
244bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private String encodeConfigSSID(WifiConfiguration config) throws Exception {
245bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        return new BigInteger(1, config.SSID.substring(1, config.SSID.length() - 1)
246bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                .getBytes("UTF-8")).toString(16);
247bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
248bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
249bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
250bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that getConfiguredNetworksSize() returns the number of network configurations
251bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * visible to the current user.
252bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
253fa6ad93d7d4ba58e0609f8eceeadecc76cea25d1Mitchell Wills    @Test
254bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testGetConfiguredNetworksSize() throws Exception {
255bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
256bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (Map.Entry<Integer, List<WifiConfiguration>> entry : VISIBLE_CONFIGS.entrySet()) {
257bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(entry.getKey());
258c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            assertEquals(entry.getValue().size(), mWifiConfigManager.getConfiguredNetworksSize());
259bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
260bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
261bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
262bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private void verifyNetworkConfig(WifiConfiguration expectedConfig,
263bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            WifiConfiguration actualConfig) {
264bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertNotNull(actualConfig);
265bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(expectedConfig.SSID, actualConfig.SSID);
266bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(expectedConfig.FQDN, actualConfig.FQDN);
267bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(expectedConfig.providerFriendlyName,
268bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                actualConfig.providerFriendlyName);
269bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(expectedConfig.configKey(), actualConfig.configKey(false));
270bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
271bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
272bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private void verifyNetworkConfigs(Collection<WifiConfiguration> expectedConfigs,
273bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            Collection<WifiConfiguration> actualConfigs) {
274bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(expectedConfigs.size(), actualConfigs.size());
275bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration expectedConfig : expectedConfigs) {
276bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            WifiConfiguration actualConfig = null;
277bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            // Find the network configuration to test (assume that |actualConfigs| contains them in
278bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            // undefined order).
279bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (final WifiConfiguration candidate : actualConfigs) {
280bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                if (candidate.networkId == expectedConfig.networkId) {
281bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    actualConfig = candidate;
282bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    break;
283bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
284bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
285bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            verifyNetworkConfig(expectedConfig, actualConfig);
286bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
287bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
288bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
289bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
290bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that getConfiguredNetworksSize() returns the network configurations visible to the
291bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * current user.
292bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
293ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
294bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testGetConfiguredNetworks() throws Exception {
295bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
296bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (Map.Entry<Integer, List<WifiConfiguration>> entry : VISIBLE_CONFIGS.entrySet()) {
297bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(entry.getKey());
29860969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan            verifyNetworkConfigs(entry.getValue(), mWifiConfigManager.getSavedNetworks());
299bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
300bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
301bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
302bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
303bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that getPrivilegedConfiguredNetworks() returns the network configurations visible to
304bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * the current user.
305bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
306ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
307bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testGetPrivilegedConfiguredNetworks() throws Exception {
308bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
309bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (Map.Entry<Integer, List<WifiConfiguration>> entry : VISIBLE_CONFIGS.entrySet()) {
310bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(entry.getKey());
311c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            verifyNetworkConfigs(entry.getValue(),
31260969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan                    mWifiConfigManager.getPrivilegedSavedNetworks());
313bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
314bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
315bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
316bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
317bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that getWifiConfiguration(int netId) can be used to access network configurations
318bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * visible to the current user only.
319bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
320ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
321bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testGetWifiConfigurationByNetworkId() throws Exception {
322bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
323bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (int userId : USER_IDS) {
324bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(userId);
325bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (WifiConfiguration expectedConfig: CONFIGS) {
326bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final WifiConfiguration actualConfig =
327c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                        mWifiConfigManager.getWifiConfiguration(expectedConfig.networkId);
3280fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                if (WifiConfigurationUtil.isVisibleToAnyProfile(expectedConfig,
3290fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(userId))) {
330bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    verifyNetworkConfig(expectedConfig, actualConfig);
331bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                } else {
332bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    assertNull(actualConfig);
333bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
334bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
335bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
336bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
337bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
338bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
339bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that getWifiConfiguration(String key) can be used to access network configurations
340bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * visible to the current user only.
341bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
342ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
343bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testGetWifiConfigurationByConfigKey() throws Exception {
344bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
345bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (int userId : USER_IDS) {
346bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(userId);
347bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (WifiConfiguration expectedConfig: CONFIGS) {
348bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final WifiConfiguration actualConfig =
349c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                        mWifiConfigManager.getWifiConfiguration(expectedConfig.configKey());
3500fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                if (WifiConfigurationUtil.isVisibleToAnyProfile(expectedConfig,
3510fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(userId))) {
352bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    verifyNetworkConfig(expectedConfig, actualConfig);
353bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                } else {
354bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    assertNull(actualConfig);
355bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
356bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
357bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
358bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
359bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
360bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
361bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that enableAllNetworks() enables all temporarily disabled network configurations
362bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * visible to the current user.
363bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
364ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
365bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testEnableAllNetworks() throws Exception {
366bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
367bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (int userId : USER_IDS) {
368bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(userId);
369bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
370bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (WifiConfiguration config : mConfiguredNetworks.valuesForAllUsers()) {
371bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final WifiConfiguration.NetworkSelectionStatus status =
372bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        config.getNetworkSelectionStatus();
373bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                status.setNetworkSelectionStatus(WifiConfiguration.NetworkSelectionStatus
374bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        .NETWORK_SELECTION_TEMPORARY_DISABLED);
375bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                status.setNetworkSelectionDisableReason(
376bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        WifiConfiguration.NetworkSelectionStatus.DISABLED_AUTHENTICATION_FAILURE);
377bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                status.setDisableTime(System.currentTimeMillis() - 60 * 60 * 1000);
378bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
379bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
380c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            mWifiConfigManager.enableAllNetworks();
381bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
382bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (WifiConfiguration config : mConfiguredNetworks.valuesForAllUsers()) {
3830fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                assertEquals(WifiConfigurationUtil.isVisibleToAnyProfile(config,
3840fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(userId)),
385bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        config.getNetworkSelectionStatus().isNetworkEnabled());
386bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
387bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
388bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
389bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
390bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
391bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that selectNetwork() disables all network configurations visible to the current user
392bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * except the selected one.
393bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
394ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
395bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testSelectNetwork() throws Exception {
396bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
397bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
398bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (int userId : USER_IDS) {
399bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            switchUser(userId);
400bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
401bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            for (WifiConfiguration config : mConfiguredNetworks.valuesForAllUsers()) {
402bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                // Enable all network configurations.
403bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                for (WifiConfiguration config2 : mConfiguredNetworks.valuesForAllUsers()) {
404bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    config2.status = WifiConfiguration.Status.ENABLED;
405bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
406bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
407bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                // Try to select a network configuration.
4082d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                reset(mWifiNative);
4092d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                when(mWifiNative.selectNetwork(config.networkId)).thenReturn(true);
410bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final boolean success =
411c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                        mWifiConfigManager.selectNetwork(config, false, config.creatorUid);
4120fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                if (!WifiConfigurationUtil.isVisibleToAnyProfile(config,
4130fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(userId))) {
414bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    // If the network configuration is not visible to the current user, verify that
415bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    // nothing changed.
416bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    assertFalse(success);
4172d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                    verify(mWifiNative, never()).selectNetwork(anyInt());
4182d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                    verify(mWifiNative, never()).enableNetwork(anyInt());
419bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    for (WifiConfiguration config2 : mConfiguredNetworks.valuesForAllUsers()) {
420bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        assertEquals(WifiConfiguration.Status.ENABLED, config2.status);
421bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    }
422bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                } else {
423bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    // If the network configuration is visible to the current user, verify that it
424bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    // was enabled and all other network configurations visible to the user were
425bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    // disabled.
426bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    assertTrue(success);
4272d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                    verify(mWifiNative).selectNetwork(config.networkId);
4282d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                    verify(mWifiNative, never()).selectNetwork(intThat(not(config.networkId)));
4292d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                    verify(mWifiNative, never()).enableNetwork(config.networkId);
4302d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                    verify(mWifiNative, never()).enableNetwork(intThat(not(config.networkId)));
431bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    for (WifiConfiguration config2 : mConfiguredNetworks.valuesForAllUsers()) {
4320fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        if (WifiConfigurationUtil.isVisibleToAnyProfile(config2,
4330fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                                USER_PROFILES.get(userId))
434bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                                && config2.networkId != config.networkId) {
435bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                            assertEquals(WifiConfiguration.Status.DISABLED, config2.status);
436bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        } else {
437bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                            assertEquals(WifiConfiguration.Status.ENABLED, config2.status);
438bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        }
439bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    }
440bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
441bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
442fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        }
443fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    }
444fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
445fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    /**
446fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     * Verifies that saveNetwork() correctly stores a network configuration in wpa_supplicant
447bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * variables and the networkHistory.txt file.
448bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * TODO: Test all variables. Currently, only the following variables are tested:
449bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * - In the wpa_supplicant: "ssid", "id_str"
450bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * - In networkHistory.txt: "CONFIG", "CREATOR_UID_KEY", "SHARED"
451fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     */
452bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private void verifySaveNetwork(int network) throws Exception {
453bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Switch to the correct user.
4540fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        switchUserToCreatorOrParentOf(CONFIGS.get(network));
455bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
456fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Set up wpa_supplicant.
457fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mWifiNative.addNetwork()).thenReturn(0);
458bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        when(mWifiNative.setNetworkVariable(eq(network), anyString(), anyString()))
459fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski                .thenReturn(true);
460bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        when(mWifiNative.setNetworkExtra(eq(network), anyString(),
461bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                (Map<String, String>) anyObject())).thenReturn(true);
462bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        when(mWifiNative.getNetworkVariable(network, WifiConfiguration.ssidVarName))
463bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                .thenReturn(encodeConfigSSID(CONFIGS.get(network)));
464eaea4b75c2ecfd192d5dcefcf67bb851bf031f5eRebecca Silberstein        when(mWifiNative.getNetworkVariable(network, WifiConfiguration.pmfVarName))
465eaea4b75c2ecfd192d5dcefcf67bb851bf031f5eRebecca Silberstein                .thenReturn("");
466fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
467fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Store a network configuration.
468c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        mWifiConfigManager.saveNetwork(CONFIGS.get(network), CONFIGS.get(network).creatorUid);
469fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
470fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Verify that wpa_supplicant variables were written correctly for the network
471fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // configuration.
472fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        final Map<String, String> metadata = new HashMap<String, String>();
473bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        if (CONFIGS.get(network).FQDN != null) {
4742d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius            metadata.put(WifiConfigStore.ID_STRING_KEY_FQDN, CONFIGS.get(network).FQDN);
475fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        }
4762d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CONFIG_KEY, CONFIGS.get(network).configKey());
4772d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CREATOR_UID,
478bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                Integer.toString(CONFIGS.get(network).creatorUid));
4792d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        verify(mWifiNative).setNetworkExtra(network, WifiConfigStore.ID_STRING_VAR_NAME,
480fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski                metadata);
481fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
482eaea4b75c2ecfd192d5dcefcf67bb851bf031f5eRebecca Silberstein        // Verify that an attempt to read back the requirePMF variable was made.
483eaea4b75c2ecfd192d5dcefcf67bb851bf031f5eRebecca Silberstein        verify(mWifiNative).getNetworkVariable(network, WifiConfiguration.pmfVarName);
484eaea4b75c2ecfd192d5dcefcf67bb851bf031f5eRebecca Silberstein
485fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Verify that no wpa_supplicant variables were read or written for any other network
486fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // configurations.
487bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verify(mWifiNative, never()).setNetworkExtra(intThat(not(network)), anyString(),
488fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski                (Map<String, String>) anyObject());
489bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verify(mWifiNative, never()).setNetworkVariable(intThat(not(network)), anyString(),
490bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                anyString());
491bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verify(mWifiNative, never()).getNetworkVariable(intThat(not(network)), anyString());
492bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
493bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Parse networkHistory.txt.
494c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        assertNotNull(mNetworkHistoryBytes);
495bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final DataInputStream stream =
496c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                new DataInputStream(new ByteArrayInputStream(mNetworkHistoryBytes));
497bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        List<String> keys = new ArrayList<>();
498bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        List<String> values = new ArrayList<>();
499bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        try {
500bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            while (true) {
501bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                final String[] tokens = stream.readUTF().split(":", 2);
502bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                if (tokens.length == 2) {
503bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    keys.add(tokens[0].trim());
504bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    values.add(tokens[1].trim());
505bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
506bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
507bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        } catch (EOFException e) {
508bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            // Ignore. This is expected.
509bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
510bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
511bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Verify that a networkHistory.txt entry was written correctly for the network
512bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // configuration.
513bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertTrue(keys.size() >= 3);
514c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        assertEquals(WifiNetworkHistory.CONFIG_KEY, keys.get(0));
515bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(CONFIGS.get(network).configKey(), values.get(0));
516c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        final int creatorUidIndex = keys.indexOf(WifiNetworkHistory.CREATOR_UID_KEY);
517bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertTrue(creatorUidIndex != -1);
518bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(Integer.toString(CONFIGS.get(network).creatorUid),
519bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                values.get(creatorUidIndex));
520c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        final int sharedIndex = keys.indexOf(WifiNetworkHistory.SHARED_KEY);
521bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertTrue(sharedIndex != -1);
522bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(Boolean.toString(CONFIGS.get(network).shared), values.get(sharedIndex));
523bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
524bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Verify that no networkHistory.txt entries were written for any other network
525bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // configurations.
526c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        final int lastConfigIndex = keys.lastIndexOf(WifiNetworkHistory.CONFIG_KEY);
527bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(0, lastConfigIndex);
528fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    }
529fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
530fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    /**
531fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     * Verifies that saveNetwork() correctly stores a regular network configuration.
532fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     */
533ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
534bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testSaveNetworkRegular() throws Exception {
535fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        verifySaveNetwork(0);
536fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    }
537fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
538fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    /**
539fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     * Verifies that saveNetwork() correctly stores a HotSpot 2.0 network configuration.
540fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     */
541ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
542bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testSaveNetworkHotspot20() throws Exception {
543fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        verifySaveNetwork(1);
544fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    }
545fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
546fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    /**
547bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that saveNetwork() correctly stores a private network configuration.
548bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
549ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
550bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testSaveNetworkPrivate() throws Exception {
551bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verifySaveNetwork(2);
552bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
553bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
554bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
555bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that loadConfiguredNetworks() correctly reads data from the wpa_supplicant, the
556bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * networkHistory.txt file and the MOManager, correlating the three sources based on the
557bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * configKey and the FQDN for HotSpot 2.0 networks.
558bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * TODO: Test all variables. Currently, only the following variables are tested:
559bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * - In the wpa_supplicant: "ssid", "id_str"
560bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * - In networkHistory.txt: "CONFIG", "CREATOR_UID_KEY", "SHARED"
561fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski     */
562ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
563fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    public void testLoadConfiguredNetworks() throws Exception {
564bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Set up list of network configurations returned by wpa_supplicant.
565fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        final String header = "network id / ssid / bssid / flags";
566fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        String networks = header;
567bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : CONFIGS) {
568bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            networks += "\n" + Integer.toString(config.networkId) + "\t" + config.SSID + "\tany";
569fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        }
570fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mWifiNative.listNetworks(anyInt())).thenReturn(header);
571fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mWifiNative.listNetworks(-1)).thenReturn(networks);
572fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
573bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Set up variables returned by wpa_supplicant for the individual network configurations.
574bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (int i = 0; i < CONFIGS.size(); ++i) {
575fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski            when(mWifiNative.getNetworkVariable(i, WifiConfiguration.ssidVarName))
576bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                .thenReturn(encodeConfigSSID(CONFIGS.get(i)));
577fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        }
578fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Legacy regular network configuration: No "id_str".
5792d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.getNetworkExtra(0, WifiConfigStore.ID_STRING_VAR_NAME))
580fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski            .thenReturn(null);
581fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Legacy Hotspot 2.0 network configuration: Quoted FQDN in "id_str".
5822d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.getNetworkExtra(1, WifiConfigStore.ID_STRING_VAR_NAME))
583fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski            .thenReturn(null);
5842d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.getNetworkVariable(1, WifiConfigStore.ID_STRING_VAR_NAME))
585bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            .thenReturn('"' + CONFIGS.get(1).FQDN + '"');
5860fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // Up-to-date Hotspot 2.0 network configuration: Metadata in "id_str".
5870fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        Map<String, String> metadata = new HashMap<String, String>();
5882d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CONFIG_KEY, CONFIGS.get(2).configKey());
5892d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CREATOR_UID,
590bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                Integer.toString(CONFIGS.get(2).creatorUid));
5912d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_FQDN, CONFIGS.get(2).FQDN);
5922d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.getNetworkExtra(2, WifiConfigStore.ID_STRING_VAR_NAME))
593fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski            .thenReturn(metadata);
5940fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        // Up-to-date regular network configuration: Metadata in "id_str".
5950fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski        metadata = new HashMap<String, String>();
5962d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CONFIG_KEY, CONFIGS.get(3).configKey());
5972d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CREATOR_UID,
5980fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                Integer.toString(CONFIGS.get(3).creatorUid));
5992d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.getNetworkExtra(3, WifiConfigStore.ID_STRING_VAR_NAME))
6000fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            .thenReturn(metadata);
601fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
602bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Set up networkHistory.txt file.
603bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final File file = File.createTempFile("networkHistory.txt", null);
604bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        file.deleteOnExit();
605c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne
606c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        Field wifiNetworkHistoryConfigFile =
607c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                WifiNetworkHistory.class.getDeclaredField("NETWORK_HISTORY_CONFIG_FILE");
608c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        wifiNetworkHistoryConfigFile.setAccessible(true);
609c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        wifiNetworkHistoryConfigFile.set(null, file.getAbsolutePath());
610c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne
611bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final DataOutputStream stream = new DataOutputStream(new FileOutputStream(file));
612bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : CONFIGS) {
613c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            stream.writeUTF(WifiNetworkHistory.CONFIG_KEY + ":  " + config.configKey() + '\n');
614c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            stream.writeUTF(WifiNetworkHistory.CREATOR_UID_KEY + ":  "
615bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    + Integer.toString(config.creatorUid) + '\n');
616c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            stream.writeUTF(WifiNetworkHistory.SHARED_KEY + ":  "
617bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    + Boolean.toString(config.shared) + '\n');
618bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
619bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        stream.close();
620bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
621fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Set up list of home service providers returned by MOManager.
622fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        final List<HomeSP> homeSPs = new ArrayList<HomeSP>();
623bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : CONFIGS) {
624bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            if (config.FQDN != null) {
625bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                homeSPs.add(new HomeSP(null, config.FQDN, new HashSet<Long>(),
6262e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        new HashSet<String>(),
6272e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        new HashSet<Long>(), new ArrayList<Long>(),
6282e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        config.providerFriendlyName, null,
6292e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        new Credential(0, 0, null, false, null, null),
6302e814680f4dd27a5f825afab189843582235cedcJan Nordqvist                        null, 0, null, null, null, 0));
631bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
632fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        }
633fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        when(mMOManager.loadAllSPs()).thenReturn(homeSPs);
634fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
635fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        // Load network configurations.
636c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        mWifiConfigManager.loadConfiguredNetworks();
637fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski
638bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Verify that network configurations were loaded and correlated correctly across the three
639bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // sources.
640bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verifyNetworkConfigs(CONFIGS, mConfiguredNetworks.valuesForAllUsers());
641bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
642bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
643bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
64475a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski     * Verifies that loadConfiguredNetworks() correctly handles duplicates when reading network
64575a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski     * configurations from the wpa_supplicant: The second configuration overwrites the first.
64675a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski     */
647ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
64875a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski    public void testLoadConfiguredNetworksEliminatesDuplicates() throws Exception {
64975a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        final WifiConfiguration config = new WifiConfiguration(CONFIGS.get(0));
65075a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        config.networkId = 1;
65175a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski
65275a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        // Set up list of network configurations returned by wpa_supplicant. The two configurations
65375a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        // are identical except for their network IDs.
65475a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        final String header = "network id / ssid / bssid / flags";
65575a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        final String networks =
65675a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski                header + "\n0\t" + config.SSID + "\tany\n1\t" + config.SSID + "\tany";
65775a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        when(mWifiNative.listNetworks(anyInt())).thenReturn(header);
65875a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        when(mWifiNative.listNetworks(-1)).thenReturn(networks);
65975a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski
66075a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        // Set up variables returned by wpa_supplicant.
66175a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        when(mWifiNative.getNetworkVariable(anyInt(), eq(WifiConfiguration.ssidVarName)))
66275a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski            .thenReturn(encodeConfigSSID(config));
66375a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        final Map<String, String> metadata = new HashMap<String, String>();
6642d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CONFIG_KEY, config.configKey());
6652d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        metadata.put(WifiConfigStore.ID_STRING_KEY_CREATOR_UID,
66675a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski                Integer.toString(config.creatorUid));
6672d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.getNetworkExtra(anyInt(), eq(WifiConfigStore.ID_STRING_VAR_NAME)))
66875a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski            .thenReturn(metadata);
66975a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski
67075a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        // Load network configurations.
671c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        mWifiConfigManager.loadConfiguredNetworks();
67275a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski
67375a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        // Verify that the second network configuration (network ID 1) overwrote the first (network
67475a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        // ID 0).
67575a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski        verifyNetworkConfigs(Arrays.asList(config), mConfiguredNetworks.valuesForAllUsers());
67675a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski    }
67775a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski
67875a766bae85ee8e94fbaad8fb5214804e7ff97e4Bartosz Fabianowski    /**
679bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that handleUserSwitch() removes ephemeral network configurations, disables network
680bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * configurations that should no longer be visible and enables network configurations that
681bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * should become visible.
682bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
683bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    private void verifyHandleUserSwitch(int oldUserId, int newUserId,
684bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            boolean makeOneConfigEphemeral) throws Exception {
685bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        addNetworks();
686bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        switchUser(oldUserId);
687bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
6882d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        reset(mWifiNative);
689bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Field lastSelectedConfigurationField =
69073a52d3336a40903965b946f6d3624a223ad5aacSamuel Tan                WifiConfigManager.class.getDeclaredField("mLastSelectedConfiguration");
691bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        lastSelectedConfigurationField.setAccessible(true);
692bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        WifiConfiguration removedEphemeralConfig = null;
693bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Set<WifiConfiguration> oldUserOnlyConfigs = new HashSet<>();
694bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Set<WifiConfiguration> newUserOnlyConfigs = new HashSet<>();
695bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Set<WifiConfiguration> neitherUserConfigs = new HashSet<>();
696bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Collection<WifiConfiguration> oldConfigs = mConfiguredNetworks.valuesForAllUsers();
697bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        int expectedNumberOfConfigs = oldConfigs.size();
698bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : oldConfigs) {
6990fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski            if (WifiConfigurationUtil.isVisibleToAnyProfile(config, USER_PROFILES.get(oldUserId))) {
700bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                config.status = WifiConfiguration.Status.ENABLED;
7010fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                if (WifiConfigurationUtil.isVisibleToAnyProfile(config,
7020fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(newUserId))) {
703bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    if (makeOneConfigEphemeral && removedEphemeralConfig == null) {
704bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        config.ephemeral = true;
705c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne                        lastSelectedConfigurationField.set(mWifiConfigManager, config.configKey());
706bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                        removedEphemeralConfig = config;
707bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    }
708bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                } else {
709bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    oldUserOnlyConfigs.add(config);
710bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
711bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            } else {
712bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                config.status = WifiConfiguration.Status.DISABLED;
7130fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                if (WifiConfigurationUtil.isVisibleToAnyProfile(config,
7140fb9cf43830d67894b519c9a6271320c4842a5c0Bartosz Fabianowski                        USER_PROFILES.get(newUserId))) {
715bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    newUserOnlyConfigs.add(config);
716bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                } else {
717bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    neitherUserConfigs.add(config);
718fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski                }
719fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski            }
720fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski        }
7212d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius
7222d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius        when(mWifiNative.disableNetwork(anyInt())).thenReturn(true);
723dc61ad4fe8a84909a288af50a8b187c98e2194b6Roshan Pius        when(mWifiNative.removeNetwork(anyInt())).thenReturn(true);
724bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
725bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        switchUser(newUserId);
726bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        if (makeOneConfigEphemeral) {
727bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            // Verify that the ephemeral network configuration was removed.
728bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            assertNotNull(removedEphemeralConfig);
729bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            assertNull(mConfiguredNetworks.getForAllUsers(removedEphemeralConfig.networkId));
730c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne            assertNull(lastSelectedConfigurationField.get(mWifiConfigManager));
7312d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius            verify(mWifiNative).removeNetwork(removedEphemeralConfig.networkId);
732bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            --expectedNumberOfConfigs;
733bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        } else {
734bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            assertNull(removedEphemeralConfig);
735bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
736bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
737bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // Verify that the other network configurations were revealed/hidden and enabled/disabled as
738bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        // appropriate.
739bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        final Collection<WifiConfiguration> newConfigs = mConfiguredNetworks.valuesForAllUsers();
740bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        assertEquals(expectedNumberOfConfigs, newConfigs.size());
741bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        for (WifiConfiguration config : newConfigs) {
742bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            if (oldUserOnlyConfigs.contains(config)) {
7432d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                verify(mWifiNative).disableNetwork(config.networkId);
744bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                assertEquals(WifiConfiguration.Status.DISABLED, config.status);
745bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            } else {
7462d65b9aaaa740ecf66bf4734c12aea3df88e352aRoshan Pius                verify(mWifiNative, never()).disableNetwork(config.networkId);
747bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                if (neitherUserConfigs.contains(config)) {
748bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                    assertEquals(WifiConfiguration.Status.DISABLED, config.status);
749bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                } else {
7509d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius                    // Only enabled in networkSelection.
7519d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius                    assertTrue(config.getNetworkSelectionStatus().isNetworkEnabled());
752bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski                }
7539d7489491984e86915b2cf4fac38a882de1c8cdbRoshan Pius
754bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski            }
755bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        }
756bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
757bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
758bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
759bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that handleUserSwitch() behaves correctly when the user switch removes an ephemeral
760bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * network configuration and reveals a private network configuration.
761bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
762ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
763bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testHandleUserSwitchWithEphemeral() throws Exception {
764bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verifyHandleUserSwitch(USER_IDS[2], USER_IDS[0], true);
765bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    }
766bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski
767bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    /**
768bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * Verifies that handleUserSwitch() behaves correctly when the user switch hides a private
769bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     * network configuration.
770bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski     */
771ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
772bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski    public void testHandleUserSwitchWithoutEphemeral() throws Exception {
773bcdabb1fa1894fcca610692ec94459fe623afa74Bartosz Fabianowski        verifyHandleUserSwitch(USER_IDS[0], USER_IDS[2], false);
774fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski    }
77578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
776ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
77778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    public void testSaveLoadEapNetworks() {
77878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        testSaveLoadSingleEapNetwork("eap network", new EnterpriseConfig(Eap.TTLS)
77978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .setPhase2(Phase2.MSCHAPV2)
78078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .setIdentity("username", "password")
78178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0}));
78278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        testSaveLoadSingleEapNetwork("eap network", new EnterpriseConfig(Eap.TTLS)
78378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .setPhase2(Phase2.MSCHAPV2)
78478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .setIdentity("username", "password")
78578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT1, FakeKeys.CA_CERT0}));
78678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
78778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    }
78878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
78978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    private void testSaveLoadSingleEapNetwork(String ssid, EnterpriseConfig eapConfig) {
79078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        final HashMap<String, String> networkVariables = new HashMap<String, String>();
79178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        reset(mWifiNative);
79278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        when(mWifiNative.addNetwork()).thenReturn(0);
79378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        when(mWifiNative.setNetworkVariable(anyInt(), anyString(), anyString())).thenAnswer(
79479d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills                new AnswerWithArguments() {
79579d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills                    public boolean answer(int netId, String name, String value) {
79678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        // Verify that no wpa_supplicant variables were written for any other
79778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        // network configurations.
79879d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills                        assertEquals(netId, 0);
79978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        networkVariables.put(name, value);
80078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        return true;
80178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    }
80278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                });
80378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        when(mWifiNative.getNetworkVariable(anyInt(), anyString())).then(
80479d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills                new AnswerWithArguments() {
80579d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills                    public String answer(int netId, String name) {
80678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        // Verify that no wpa_supplicant variables were read for any other
80778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        // network configurations.
80879d691a718a3b8980f99940cbeae8d434c469858Mitchell Wills                        assertEquals(netId, 0);
80978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        return networkVariables.get(name);
81078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    }
81178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                });
81278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        when(mWifiNative.setNetworkExtra(eq(0), anyString(), (Map<String, String>) anyObject()))
81378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                .thenReturn(true);
81478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
81578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        WifiConfiguration config = new WifiConfiguration();
81678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        config.SSID = ssid;
81778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        config.creatorUid = Process.WIFI_UID;
81878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        config.allowedKeyManagement.set(KeyMgmt.WPA_EAP);
81978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        config.enterpriseConfig = eapConfig.enterpriseConfig;
82078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
82178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        // Store a network configuration.
822c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        mWifiConfigManager.saveNetwork(config, Process.WIFI_UID);
82378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
82478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        // Verify that wpa_supplicant variables were written correctly for the network
82578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        // configuration.
82678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        verify(mWifiNative).addNetwork();
82778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.eap,
82878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                unquote(networkVariables.get(WifiEnterpriseConfig.EAP_KEY)));
82978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.phase2,
83078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                unquote(networkVariables.get(WifiEnterpriseConfig.PHASE2_KEY)));
83178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.identity,
83278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                unquote(networkVariables.get(WifiEnterpriseConfig.IDENTITY_KEY)));
83378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.password,
83478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                unquote(networkVariables.get(WifiEnterpriseConfig.PASSWORD_KEY)));
83578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertSavedCaCerts(eapConfig,
83678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                unquote(networkVariables.get(WifiEnterpriseConfig.CA_CERT_KEY)));
83778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
83878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        // Prepare the scan result.
83978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        final String header = "network id / ssid / bssid / flags";
84078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        String networks = header + "\n" + Integer.toString(0) + "\t" + ssid + "\tany";
84178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        when(mWifiNative.listNetworks(anyInt())).thenReturn(header);
84278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        when(mWifiNative.listNetworks(-1)).thenReturn(networks);
84378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
84478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        // Load back the configuration.
845c485ebf64d1049d17db8108b85653f53fcdc8949Glen Kuhne        mWifiConfigManager.loadConfiguredNetworks();
84660969bf2c849011fb585cf6dc914dbd779dfb8cfSamuel Tan        List<WifiConfiguration> configs = mWifiConfigManager.getSavedNetworks();
84778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(1, configs.size());
84878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        WifiConfiguration loadedConfig = configs.get(0);
84978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(ssid, unquote(loadedConfig.SSID));
85078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        BitSet keyMgmt = new BitSet();
85178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        keyMgmt.set(KeyMgmt.WPA_EAP);
85278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(keyMgmt, loadedConfig.allowedKeyManagement);
85378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.enterpriseConfig.getEapMethod(),
85478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                loadedConfig.enterpriseConfig.getEapMethod());
85578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.enterpriseConfig.getPhase2Method(),
85678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                loadedConfig.enterpriseConfig.getPhase2Method());
85778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.enterpriseConfig.getIdentity(),
85878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                loadedConfig.enterpriseConfig.getIdentity());
85978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(eapConfig.enterpriseConfig.getPassword(),
86078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                loadedConfig.enterpriseConfig.getPassword());
86178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        asserCaCertsAliasesMatch(eapConfig.caCerts,
86278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                loadedConfig.enterpriseConfig.getCaCertificateAliases());
86378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    }
86478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
86578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    private String unquote(String value) {
86678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        if (value == null) {
86778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            return null;
86878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
86978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        int length = value.length();
87078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        if ((length > 1) && (value.charAt(0) == '"')
87178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                && (value.charAt(length - 1) == '"')) {
87278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            return value.substring(1, length - 1);
87378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        } else {
87478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            return value;
87578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
87678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    }
87778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
87878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    private void asserCaCertsAliasesMatch(X509Certificate[] certs, String[] aliases) {
87978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        assertEquals(certs.length, aliases.length);
88078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        List<String> aliasList = new ArrayList<String>(Arrays.asList(aliases));
88178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        try {
88278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            for (int i = 0; i < certs.length; i++) {
88378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                byte[] certPem = Credentials.convertToPem(certs[i]);
88478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                boolean found = false;
88578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                for (int j = 0; j < aliasList.size(); j++) {
88678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    byte[] keystoreCert = mMockKeyStore.getKeyBlob(Process.WIFI_UID,
88778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                            Credentials.CA_CERTIFICATE + aliasList.get(j)).blob;
88878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    if (Arrays.equals(keystoreCert, certPem)) {
88978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        found = true;
89078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        aliasList.remove(j);
89178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                        break;
89278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    }
89378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                }
89478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                assertTrue(found);
89578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            }
89678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        } catch (CertificateEncodingException | IOException e) {
89778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            fail("Cannot convert CA certificate to encoded form.");
89878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
89978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    }
90078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
90178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    private void assertSavedCaCerts(EnterpriseConfig eapConfig, String caCertVariable) {
90278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        ArrayList<String> aliases = new ArrayList<String>();
90378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        if (TextUtils.isEmpty(caCertVariable)) {
90478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            // Do nothing.
90578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        } else if (caCertVariable.startsWith(WifiEnterpriseConfig.CA_CERT_PREFIX)) {
90678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            aliases.add(caCertVariable.substring(WifiEnterpriseConfig.CA_CERT_PREFIX.length()));
90778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        } else if (caCertVariable.startsWith(WifiEnterpriseConfig.KEYSTORES_URI)) {
90878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            String[] encodedAliases = TextUtils.split(
90978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    caCertVariable.substring(WifiEnterpriseConfig.KEYSTORES_URI.length()),
91078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                    WifiEnterpriseConfig.CA_CERT_ALIAS_DELIMITER);
91178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            for (String encodedAlias : encodedAliases) {
91278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                String alias = WifiEnterpriseConfig.decodeCaCertificateAlias(encodedAlias);
91378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                assertTrue(alias.startsWith(Credentials.CA_CERTIFICATE));
91478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu                aliases.add(alias.substring(Credentials.CA_CERTIFICATE.length()));
91578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            }
91678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        } else {
91778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            fail("Unrecognized ca_cert variable: " + caCertVariable);
91878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
91978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        asserCaCertsAliasesMatch(eapConfig.caCerts, aliases.toArray(new String[aliases.size()]));
92078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    }
92178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
92278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    private static class EnterpriseConfig {
92378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public String eap;
92478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public String phase2;
92578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public String identity;
92678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public String password;
92778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public X509Certificate[] caCerts;
92878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public WifiEnterpriseConfig enterpriseConfig;
92978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu
93078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public EnterpriseConfig(int eapMethod) {
93178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            enterpriseConfig = new WifiEnterpriseConfig();
93278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            enterpriseConfig.setEapMethod(eapMethod);
93378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            eap = Eap.strings[eapMethod];
93478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
93578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public EnterpriseConfig setPhase2(int phase2Method) {
93678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            enterpriseConfig.setPhase2Method(phase2Method);
93778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            phase2 = "auth=" + Phase2.strings[phase2Method];
93878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            return this;
93978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
94078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public EnterpriseConfig setIdentity(String identity, String password) {
94178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            enterpriseConfig.setIdentity(identity);
94278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            enterpriseConfig.setPassword(password);
94378463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            this.identity = identity;
94478463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            this.password = password;
94578463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            return this;
94678463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
94778463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        public EnterpriseConfig setCaCerts(X509Certificate[] certs) {
94878463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            enterpriseConfig.setCaCertificates(certs);
94978463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            caCerts = certs;
95078463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu            return this;
95178463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu        }
95278463be32c01259841f4c0b670b742c3c2040cf3Rubin Xu    }
953ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
954ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    /**
955ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     * Generates an array of unique random numbers below the specified maxValue.
956ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     * Values range from 0 to maxValue-1.
957ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     */
958ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    private static ArrayDeque<Integer> getUniqueRandomNumberValues(
959ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            int seed,
960ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            int maxValue,
961ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            int numValues) {
962ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        assertTrue(numValues <= maxValue);
963ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        Random rand = new Random(WifiTestUtil.getTestMethod().hashCode() + seed);
964ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        ArrayDeque<Integer> randomNumberList = new ArrayDeque<>();
965ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        for (int i = 0; i < numValues; i++) {
966ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            int num = rand.nextInt(maxValue);
967ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            while (randomNumberList.contains(num)) {
968ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                num = rand.nextInt(maxValue);
969ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            }
970ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            randomNumberList.push(num);
971ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        }
972ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        return randomNumberList;
973ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    }
974ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
975ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    /**
976ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     * Verifies that the networks in pnoNetworkList is sorted in the same order as the
977ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     * network in expectedNetworkIDOrder list.
978ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     */
979ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    private static void verifyPnoNetworkListOrder(
9808c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList,
981ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            ArrayList<Integer> expectedNetworkIdOrder) throws Exception  {
982ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        int i = 0;
9838c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius        for (WifiScanner.PnoSettings.PnoNetwork pnoNetwork : pnoNetworkList) {
984ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            Log.i(TAG, "PNO Network List Index: " + i + ", networkID: " + pnoNetwork.networkId);
9855c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            assertEquals("Expected network ID: " + pnoNetwork.networkId,
9865c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    pnoNetwork.networkId, expectedNetworkIdOrder.get(i++).intValue());
987ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        }
988ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    }
989ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
990ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    /**
9919bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * Verifies the retrieveDisconnectedPnoNetworkList API. The test verifies that the list
9925c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius     * returned from the API is sorted as expected.
993ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius     */
994ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    @Test
9959bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    public void testDisconnectedPnoNetworkListCreation() throws Exception {
996ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        addNetworks();
997ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
998ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        Random rand = new Random(WifiTestUtil.getTestMethod().hashCode());
999ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
1000ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // First assign random |numAssociation| values and verify that the list is sorted
1001ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // in descending order of |numAssociation| values. Keep NetworkSelectionStatus
1002ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // values constant.
1003ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        for (int userId : USER_IDS) {
1004ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            switchUser(userId);
1005ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            TreeMap<Integer, Integer> numAssociationToNetworkIdMap =
1006ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    new TreeMap<>(Collections.reverseOrder());
1007ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            ArrayDeque<Integer> numAssociationValues =
1008ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    getUniqueRandomNumberValues(
1009ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                            1, 10000, mConfiguredNetworks.valuesForCurrentUser().size());
1010ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
1011ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.numAssociation = numAssociationValues.pop();
1012ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.priority = rand.nextInt(10000);
1013ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
1014ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
1015ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                numAssociationToNetworkIdMap.put(config.numAssociation, config.networkId);
1016ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", numAssociation: "
1017ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        + config.numAssociation);
1018ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            }
10198c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
10209bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveDisconnectedPnoNetworkList();
1021ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
1022ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    new ArrayList(numAssociationToNetworkIdMap.values()));
1023ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        }
1024ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
1025ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // Assign random |priority| values and verify that the list is sorted in descending order
1026ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // of |priority| values. Keep numAssociation/NetworkSelectionStatus values constant.
1027ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        for (int userId : USER_IDS) {
1028ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            switchUser(userId);
1029ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            TreeMap<Integer, Integer> priorityToNetworkIdMap =
1030ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    new TreeMap<>(Collections.reverseOrder());
1031ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            ArrayDeque<Integer> priorityValues =
1032ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    getUniqueRandomNumberValues(
1033ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                            2, 10000, mConfiguredNetworks.valuesForCurrentUser().size());
1034ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
1035ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.numAssociation = 0;
1036ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.priority = priorityValues.pop();
1037ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
1038ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
1039ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                priorityToNetworkIdMap.put(config.priority, config.networkId);
1040ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", priority: " + config.priority);
1041ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            }
10428c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
10439bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveDisconnectedPnoNetworkList();
1044ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
1045ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    new ArrayList(priorityToNetworkIdMap.values()));
1046ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        }
1047ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius
1048ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // Now assign random |NetworkSelectionStatus| values and verify that the list is sorted in
1049ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        // ascending order of |NetworkSelectionStatus| values.
1050ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        for (int userId : USER_IDS) {
1051ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            switchUser(userId);
1052ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            TreeMap<Integer, Integer> networkSelectionStatusToNetworkIdMap = new TreeMap<>();
1053ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            ArrayDeque<Integer> networkSelectionStatusValues =
1054ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    getUniqueRandomNumberValues(
1055ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                            3,
1056ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                            WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_STATUS_MAX,
1057ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                            mConfiguredNetworks.valuesForCurrentUser().size());
1058ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
1059ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.numAssociation = rand.nextInt(10000);
1060ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.priority = rand.nextInt(10000);
1061ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
1062ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        networkSelectionStatusValues.pop());
1063eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                // Permanently disabled networks should not be present in PNO scan request.
1064eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                if (!config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()) {
1065eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                    networkSelectionStatusToNetworkIdMap.put(
1066eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                            config.getNetworkSelectionStatus().getNetworkSelectionStatus(),
1067eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                            config.networkId);
1068eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                }
1069ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", NetworkSelectionStatus: "
1070ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        + config.getNetworkSelectionStatus().getNetworkSelectionStatus());
1071ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            }
10728c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
10739bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveDisconnectedPnoNetworkList();
10745c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
10755c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new ArrayList(networkSelectionStatusToNetworkIdMap.values()));
10765c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        }
10775c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    }
10785c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
10795c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    /**
10809bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * Verifies the retrieveConnectedPnoNetworkList API. The test verifies that the list
10815c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius     * returned from the API is sorted as expected.
10825c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius     */
10835c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    @Test
10849bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    public void testConnectedPnoNetworkListCreation() throws Exception {
10855c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        addNetworks();
10865c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
10875c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        Random rand = new Random(WifiTestUtil.getTestMethod().hashCode());
10885c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
10895c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // First assign |lastSeen| values and verify that the list is sorted
10905c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // in descending order of |lastSeen| values. Keep NetworkSelectionStatus
10915c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // values constant.
10925c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        for (int userId : USER_IDS) {
10935c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            switchUser(userId);
10945c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            TreeMap<Boolean, Integer> lastSeenToNetworkIdMap =
10955c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new TreeMap<>(Collections.reverseOrder());
10965c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            ArrayDeque<Integer> lastSeenValues = getUniqueRandomNumberValues(1, 2, 2);
10975c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            if (mConfiguredNetworks.valuesForCurrentUser().size() > 2) continue;
10985c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
10995c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.numAssociation = rand.nextInt(10000);
11005c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.priority = rand.nextInt(10000);
11015c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
11025c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
11035c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                boolean lastSeenValue = (lastSeenValues.pop()  == 1);
11045c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setSeenInLastQualifiedNetworkSelection(
11055c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        lastSeenValue);
11065c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                lastSeenToNetworkIdMap.put(lastSeenValue, config.networkId);
11075c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", lastSeen: " + lastSeenValue);
11085c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            }
11098c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
11109bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveConnectedPnoNetworkList();
11115c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
11125c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new ArrayList(lastSeenToNetworkIdMap.values()));
11135c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        }
11145c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
11155c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // Assign random |numAssociation| values and verify that the list is sorted
11165c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // in descending order of |numAssociation| values. Keep NetworkSelectionStatus/lastSeen
11175c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // values constant.
11185c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        for (int userId : USER_IDS) {
11195c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            switchUser(userId);
11205c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            TreeMap<Integer, Integer> numAssociationToNetworkIdMap =
11215c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new TreeMap<>(Collections.reverseOrder());
11225c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            ArrayDeque<Integer> numAssociationValues =
11235c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    getUniqueRandomNumberValues(
11245c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            1, 10000, mConfiguredNetworks.valuesForCurrentUser().size());
11255c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
11265c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.numAssociation = numAssociationValues.pop();
11275c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.priority = rand.nextInt(10000);
11285c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
11295c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
11305c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setSeenInLastQualifiedNetworkSelection(true);
11315c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                numAssociationToNetworkIdMap.put(config.numAssociation, config.networkId);
11325c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", numAssociation: "
11335c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        + config.numAssociation);
11345c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            }
11358c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
11369bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveConnectedPnoNetworkList();
11375c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
11385c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new ArrayList(numAssociationToNetworkIdMap.values()));
11395c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        }
11405c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
11415c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // Now assign random |NetworkSelectionStatus| values and verify that the list is sorted in
11425c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // ascending order of |NetworkSelectionStatus| values.
11435c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        for (int userId : USER_IDS) {
11445c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            switchUser(userId);
11455c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            TreeMap<Integer, Integer> networkSelectionStatusToNetworkIdMap = new TreeMap<>();
11465c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            ArrayDeque<Integer> networkSelectionStatusValues =
11475c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    getUniqueRandomNumberValues(
11485c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            3,
11495c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_STATUS_MAX,
11505c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            mConfiguredNetworks.valuesForCurrentUser().size());
11515c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
11525c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.numAssociation = rand.nextInt(10000);
11535c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.priority = rand.nextInt(10000);
11545c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
11555c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        networkSelectionStatusValues.pop());
1156eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                // Permanently disabled networks should not be present in PNO scan request.
1157eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                if (!config.getNetworkSelectionStatus().isNetworkPermanentlyDisabled()) {
1158eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                    networkSelectionStatusToNetworkIdMap.put(
1159eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                            config.getNetworkSelectionStatus().getNetworkSelectionStatus(),
1160eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                            config.networkId);
1161eb77c40b3d17153fe91ca1691aaf2ad16f3f7267Roshan Pius                }
11625c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", NetworkSelectionStatus: "
11635c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        + config.getNetworkSelectionStatus().getNetworkSelectionStatus());
11645c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            }
11658c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
11669bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveConnectedPnoNetworkList();
1167ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
1168ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    new ArrayList(networkSelectionStatusToNetworkIdMap.values()));
1169ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        }
1170ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    }
117193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
117293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
117393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is false for a newly added network
117493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
117593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
117693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testAddNetworkHasEverConnectedFalse() throws Exception {
117793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        addNetwork(BASE_HAS_EVER_CONNECTED_CONFIG);
117893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(
117993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
118093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Adding a new network should not have hasEverConnected set to true.",
118193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
118293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
118393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
118493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
118593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
118693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is false for a newly added network even when new config has
118793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * mistakenly set HasEverConnected to true.
118893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    */
118993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
119093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testAddNetworkOverridesHasEverConnectedWhenTrueInNewConfig() throws Exception {
119193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration newNetworkWithHasEverConnectedTrue =
119293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                new WifiConfiguration(BASE_HAS_EVER_CONNECTED_CONFIG);
119393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        newNetworkWithHasEverConnectedTrue.getNetworkSelectionStatus().setHasEverConnected(true);
119493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        addNetwork(newNetworkWithHasEverConnectedTrue);
119593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // check if addNetwork clears the bit.
119693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(
119793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                newNetworkWithHasEverConnectedTrue.networkId);
119893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Adding a new network should not have hasEverConnected set to true.",
119993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
120093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
120193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
120293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
120393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
120493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify that setting HasEverConnected with a config update can be read back.
120593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
120693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
120793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateConfigToHasEverConnectedTrue() throws Exception {
120893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        addNetwork(BASE_HAS_EVER_CONNECTED_CONFIG);
120993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
121093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Get the newly saved config and update HasEverConnected
121193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(
121293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
121393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Adding a new network should not have hasEverConnected set to true.",
121493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
121593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkConfig.getNetworkSelectionStatus().setHasEverConnected(true);
121693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(checkConfig, HAS_EVER_CONNECTED_USER);
121793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
121893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // verify that HasEverConnected was properly written and read back
121993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedTrue(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
122093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
122193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
122293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
122393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
122493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config preSharedKey is updated.
122593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
122693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
122793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdatePreSharedKeyClearsHasEverConnected() throws Exception {
122893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
122993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
123093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
123193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
123293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration original = mWifiConfigManager.getWifiConfiguration(
123393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
123493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
123593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updatePreSharedKeyConfig = new WifiConfiguration();
123693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updatePreSharedKeyConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
123793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updatePreSharedKeyConfig.SSID = original.SSID;
123893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updatePreSharedKeyConfig.preSharedKey = "newpassword";
123993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(original);
124093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updatePreSharedKeyConfig,
124193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
124293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
124393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
124493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
124593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
124693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
124793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
124893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedKeyManagement is
124993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
125093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
125193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
125293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedKeyManagementChanged() throws Exception {
125393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
125493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
125593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
125693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
125793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedKeyManagementConfig = new WifiConfiguration();
125893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedKeyManagementConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
125993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedKeyManagementConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
126093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedKeyManagementConfig.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
126193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
126293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
126393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedKeyManagementString = makeString(
126493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedKeyManagementConfig.allowedKeyManagement,
126593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.KeyMgmt.strings);
126693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
126793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                KeyMgmt.varName)).thenReturn(allowedKeyManagementString);
126893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
126993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
127093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedKeyManagementConfig,
127193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
127293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
127393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
127493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
127593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
127693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
127793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
127893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedProtocols is
127993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
128093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
128193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
128293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedProtocolsChanged() throws Exception {
128393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
128493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
128593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
128693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
128793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedProtocolsConfig = new WifiConfiguration();
128893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedProtocolsConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
128993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedProtocolsConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
129093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedProtocolsConfig.allowedProtocols.set(
129193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.Protocol.RSN);
129293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
129393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
129493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedProtocolsString = makeString(
129593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedProtocolsConfig.allowedProtocols,
129693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.Protocol.strings);
129793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
129893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                Protocol.varName)).thenReturn(allowedProtocolsString);
129993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
130093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
130193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedProtocolsConfig,
130293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
130393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
130493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
130593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
130693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
130793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
130893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
130993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedAuthAlgorithms is
131093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
131193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
131293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
131393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedAuthAlgorithmsChanged() throws Exception {
131493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
131593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
131693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
131793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
131893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedAuthAlgorithmsConfig = new WifiConfiguration();
131993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedAuthAlgorithmsConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
132093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedAuthAlgorithmsConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
132193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedAuthAlgorithmsConfig.allowedAuthAlgorithms.set(
132293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.AuthAlgorithm.SHARED);
132393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
132493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
132593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedAuthAlgorithmsString = makeString(
132693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedAuthAlgorithmsConfig.allowedAuthAlgorithms,
132793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.AuthAlgorithm.strings);
132893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
132993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                AuthAlgorithm.varName)).thenReturn(allowedAuthAlgorithmsString);
133093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
133193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
133293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedAuthAlgorithmsConfig,
133393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
133493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
133593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
133693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
133793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
133893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
133993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
134093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedPairwiseCiphers is
134193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
134293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
134393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
134493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedPairwiseCiphersChanged() throws Exception {
134593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
134693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
134793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
134893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
134993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedPairwiseCiphersConfig = new WifiConfiguration();
135093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedPairwiseCiphersConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
135193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedPairwiseCiphersConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
135293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedPairwiseCiphersConfig.allowedPairwiseCiphers.set(
135393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.PairwiseCipher.CCMP);
135493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
135593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
135693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedPairwiseCiphersString = makeString(
135793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedPairwiseCiphersConfig.allowedPairwiseCiphers,
135893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.PairwiseCipher.strings);
135993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
136093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                PairwiseCipher.varName)).thenReturn(allowedPairwiseCiphersString);
136193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
136293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
136393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedPairwiseCiphersConfig,
136493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
136593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
136693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
136793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
136893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
136993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
137093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
137193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedGroupCiphers is
137293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
137393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
137493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
137593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedGroupCiphersChanged() throws Exception {
137693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
137793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
137893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
137993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
138093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedGroupCiphersConfig = new WifiConfiguration();
138193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedGroupCiphersConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
138293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedGroupCiphersConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
138393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedGroupCiphersConfig.allowedGroupCiphers.set(
138493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.GroupCipher.CCMP);
138593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
138693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
138793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedGroupCiphersString = makeString(
138893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedGroupCiphersConfig.allowedGroupCiphers,
138993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.GroupCipher.strings);
139093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
139193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                GroupCipher.varName)).thenReturn(allowedGroupCiphersString);
139293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
139393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
139493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedGroupCiphersConfig,
139593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
139693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
139793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
139893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
139993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
140093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
140193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
140293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config wepKeys is
140393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
140493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
140593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
140693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateWepKeysChanged() throws Exception {
140793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
140893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
140993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
141093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
141193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String tempKey = "hereisakey";
141293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateWepKeysConfig = new WifiConfiguration();
141393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateWepKeysConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
141493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateWepKeysConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
141593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateWepKeysConfig.wepKeys = new String[] {tempKey};
141693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
141793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
141893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
141993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.wepKeyVarNames[0])).thenReturn(tempKey);
142093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
142193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
142293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateWepKeysConfig,
142393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
142493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
142593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
142693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
142793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
142893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
142993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
143093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config hiddenSSID is
143193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
143293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
143393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
143493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateHiddenSSIDChanged() throws Exception {
143593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
143693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
143793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
143893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
143993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateHiddenSSIDConfig = new WifiConfiguration();
144093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateHiddenSSIDConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
144193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateHiddenSSIDConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
144293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateHiddenSSIDConfig.hiddenSSID = true;
144393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
144493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
144593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
144693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.hiddenSSIDVarName)).thenReturn("1");
144793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
144893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
144993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateHiddenSSIDConfig,
145093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
145193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
145293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
145393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
145493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
145593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
145693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
145793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config pmfVarName is
145893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
145993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
146093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
146193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateRequirePMFChanged() throws Exception {
146293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
146393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
146493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
146593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
146693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateRequirePMFConfig = new WifiConfiguration();
146793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateRequirePMFConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
146893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateRequirePMFConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
146993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateRequirePMFConfig.requirePMF = true;
147093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
147193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
147293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // TODO: please see b/28088226  - this test is implemented as if WifiConfigStore correctly
147393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // read back the boolean value.  When fixed, uncomment the following line and the
147493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // checkHasEverConnectedFalse below.
147593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        //when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
147693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        //        WifiConfiguration.pmfVarName)).thenReturn("2");
147793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
147893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
147993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateRequirePMFConfig,
148093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
148193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
148293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        //checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
148393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedTrue(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
148493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
148593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
148693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
148793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
148893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig changes are detected in WifiConfigManager.
148993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
149093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
149193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testEnterpriseConfigAdded() {
149293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
149393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
149493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
149593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
149693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
149793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(null, eapConfig.enterpriseConfig));
149893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
149993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
150093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
150193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig eap change is detected.
150293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
150393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
150493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testEnterpriseConfigEapChangeDetected() {
150593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig = new EnterpriseConfig(Eap.TTLS);
150693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig peapConfig = new EnterpriseConfig(Eap.PEAP);
150793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
150893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
150993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                peapConfig.enterpriseConfig));
151093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
151193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
151293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
151393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig phase2 method change is detected.
151493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
151593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
151693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testEnterpriseConfigPhase2ChangeDetected() {
151793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig = new EnterpriseConfig(Eap.TTLS).setPhase2(Phase2.MSCHAPV2);
151893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig papConfig = new EnterpriseConfig(Eap.TTLS).setPhase2(Phase2.PAP);
151993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
152093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
152193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                papConfig.enterpriseConfig));
152293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
152393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
152493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
152593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig added Certificate is detected.
152693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
152793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
152893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testCaCertificateAddedDetected() {
152993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigNoCerts =  new EnterpriseConfig(Eap.TTLS)
153093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
153193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password");
153293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
153393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig1Cert =  new EnterpriseConfig(Eap.TTLS)
153493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
153593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
153693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
153793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
153893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfigNoCerts.enterpriseConfig,
153993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfig1Cert.enterpriseConfig));
154093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
154193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
154293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
154393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig Certificate change is detected.
154493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
154593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
154693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testDifferentCaCertificateDetected() {
154793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
154893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
154993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
155093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
155193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
155293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigNewCert =  new EnterpriseConfig(Eap.TTLS)
155393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
155493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
155593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT1});
155693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
155793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
155893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfigNewCert.enterpriseConfig));
155993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
156093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
156193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
156293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig added Certificate changes are detected.
156393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
156493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
156593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testCaCertificateChangesDetected() {
156693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
156793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
156893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
156993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
157093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
157193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigAddedCert =  new EnterpriseConfig(Eap.TTLS)
157293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
157393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
157493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
157593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
157693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
157793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfigAddedCert.enterpriseConfig));
157893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
157993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
158093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
158193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify that WifiEnterpriseConfig does not detect changes for identical configs.
158293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
158393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
158493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testWifiEnterpriseConfigNoChanges() {
158593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
158693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
158793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
158893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
158993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
159093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Just to be clear that check is not against the same object
159193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigSame =  new EnterpriseConfig(Eap.TTLS)
159293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
159393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
159493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
159593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
159693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
159793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfigSame.enterpriseConfig));
159893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
159993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
160093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
160193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private void checkHasEverConnectedTrue(int networkId) {
160293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(networkId);
160393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue("hasEverConnected expected to be true.",
160493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
160593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
160693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
160793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private void checkHasEverConnectedFalse(int networkId) {
160893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(networkId);
160993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Updating credentials network config should clear hasEverConnected.",
161093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
161193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
161293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
161393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
161493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     *  Helper function to translate from WifiConfiguration BitSet to String.
161593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
161693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private static String makeString(BitSet set, String[] strings) {
161793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        StringBuffer buf = new StringBuffer();
161893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        int nextSetBit = -1;
161993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
162093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        /* Make sure all set bits are in [0, strings.length) to avoid
162193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein         * going out of bounds on strings.  (Shouldn't happen, but...) */
162293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        set = set.get(0, strings.length);
162393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
162493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
162593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            buf.append(strings[nextSetBit].replace('_', '-')).append(' ');
162693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        }
162793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
162893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // remove trailing space
162993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        if (set.cardinality() > 0) {
163093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            buf.setLength(buf.length() - 1);
163193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        }
163293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
163393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        return buf.toString();
163493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
163593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
163693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
1637fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski}
1638