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());
1063ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                networkSelectionStatusToNetworkIdMap.put(
1064ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        config.getNetworkSelectionStatus().getNetworkSelectionStatus(),
1065ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        config.networkId);
1066ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", NetworkSelectionStatus: "
1067ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                        + config.getNetworkSelectionStatus().getNetworkSelectionStatus());
1068ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            }
10698c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
10709bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveDisconnectedPnoNetworkList();
10715c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
10725c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new ArrayList(networkSelectionStatusToNetworkIdMap.values()));
10735c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        }
10745c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    }
10755c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
10765c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    /**
10779bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius     * Verifies the retrieveConnectedPnoNetworkList API. The test verifies that the list
10785c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius     * returned from the API is sorted as expected.
10795c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius     */
10805c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius    @Test
10819bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius    public void testConnectedPnoNetworkListCreation() throws Exception {
10825c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        addNetworks();
10835c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
10845c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        Random rand = new Random(WifiTestUtil.getTestMethod().hashCode());
10855c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
10865c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // First assign |lastSeen| values and verify that the list is sorted
10875c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // in descending order of |lastSeen| values. Keep NetworkSelectionStatus
10885c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // values constant.
10895c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        for (int userId : USER_IDS) {
10905c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            switchUser(userId);
10915c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            TreeMap<Boolean, Integer> lastSeenToNetworkIdMap =
10925c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new TreeMap<>(Collections.reverseOrder());
10935c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            ArrayDeque<Integer> lastSeenValues = getUniqueRandomNumberValues(1, 2, 2);
10945c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            if (mConfiguredNetworks.valuesForCurrentUser().size() > 2) continue;
10955c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
10965c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.numAssociation = rand.nextInt(10000);
10975c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.priority = rand.nextInt(10000);
10985c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
10995c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
11005c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                boolean lastSeenValue = (lastSeenValues.pop()  == 1);
11015c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setSeenInLastQualifiedNetworkSelection(
11025c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        lastSeenValue);
11035c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                lastSeenToNetworkIdMap.put(lastSeenValue, config.networkId);
11045c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", lastSeen: " + lastSeenValue);
11055c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            }
11068c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
11079bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveConnectedPnoNetworkList();
11085c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
11095c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new ArrayList(lastSeenToNetworkIdMap.values()));
11105c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        }
11115c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
11125c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // Assign random |numAssociation| values and verify that the list is sorted
11135c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // in descending order of |numAssociation| values. Keep NetworkSelectionStatus/lastSeen
11145c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // values constant.
11155c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        for (int userId : USER_IDS) {
11165c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            switchUser(userId);
11175c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            TreeMap<Integer, Integer> numAssociationToNetworkIdMap =
11185c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new TreeMap<>(Collections.reverseOrder());
11195c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            ArrayDeque<Integer> numAssociationValues =
11205c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    getUniqueRandomNumberValues(
11215c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            1, 10000, mConfiguredNetworks.valuesForCurrentUser().size());
11225c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
11235c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.numAssociation = numAssociationValues.pop();
11245c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.priority = rand.nextInt(10000);
11255c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
11265c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_ENABLED);
11275c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setSeenInLastQualifiedNetworkSelection(true);
11285c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                numAssociationToNetworkIdMap.put(config.numAssociation, config.networkId);
11295c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", numAssociation: "
11305c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        + config.numAssociation);
11315c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            }
11328c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
11339bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveConnectedPnoNetworkList();
11345c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
11355c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    new ArrayList(numAssociationToNetworkIdMap.values()));
11365c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        }
11375c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius
11385c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // Now assign random |NetworkSelectionStatus| values and verify that the list is sorted in
11395c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        // ascending order of |NetworkSelectionStatus| values.
11405c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius        for (int userId : USER_IDS) {
11415c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            switchUser(userId);
11425c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            TreeMap<Integer, Integer> networkSelectionStatusToNetworkIdMap = new TreeMap<>();
11435c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            ArrayDeque<Integer> networkSelectionStatusValues =
11445c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                    getUniqueRandomNumberValues(
11455c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            3,
11465c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            WifiConfiguration.NetworkSelectionStatus.NETWORK_SELECTION_STATUS_MAX,
11475c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                            mConfiguredNetworks.valuesForCurrentUser().size());
11485c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            for (WifiConfiguration config : mConfiguredNetworks.valuesForCurrentUser()) {
11495c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.numAssociation = rand.nextInt(10000);
11505c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.priority = rand.nextInt(10000);
11515c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                config.getNetworkSelectionStatus().setNetworkSelectionStatus(
11525c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        networkSelectionStatusValues.pop());
11535c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                networkSelectionStatusToNetworkIdMap.put(
11545c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        config.getNetworkSelectionStatus().getNetworkSelectionStatus(),
11555c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        config.networkId);
11565c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                Log.i(TAG, "networkID: " + config.networkId + ", NetworkSelectionStatus: "
11575c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius                        + config.getNetworkSelectionStatus().getNetworkSelectionStatus());
11585c3c06082b24f9ff0d479e82a63b52220c86598bRoshan Pius            }
11598c0c14b2c98bc26e6a09f66cff1244f0a30f44cbRoshan Pius            ArrayList<WifiScanner.PnoSettings.PnoNetwork> pnoNetworkList =
11609bd01d6cb65ea96d6729d35a1fc43bb2bb40e3bdRoshan Pius                    mWifiConfigManager.retrieveConnectedPnoNetworkList();
1161ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius            verifyPnoNetworkListOrder(pnoNetworkList,
1162ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius                    new ArrayList(networkSelectionStatusToNetworkIdMap.values()));
1163ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius        }
1164ac9ad3283508db15b65b1cbb89b841278973276bRoshan Pius    }
116593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
116693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
116793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is false for a newly added network
116893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
116993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
117093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testAddNetworkHasEverConnectedFalse() throws Exception {
117193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        addNetwork(BASE_HAS_EVER_CONNECTED_CONFIG);
117293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(
117393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
117493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Adding a new network should not have hasEverConnected set to true.",
117593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
117693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
117793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
117893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
117993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
118093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is false for a newly added network even when new config has
118193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * mistakenly set HasEverConnected to true.
118293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    */
118393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
118493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testAddNetworkOverridesHasEverConnectedWhenTrueInNewConfig() throws Exception {
118593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration newNetworkWithHasEverConnectedTrue =
118693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                new WifiConfiguration(BASE_HAS_EVER_CONNECTED_CONFIG);
118793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        newNetworkWithHasEverConnectedTrue.getNetworkSelectionStatus().setHasEverConnected(true);
118893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        addNetwork(newNetworkWithHasEverConnectedTrue);
118993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // check if addNetwork clears the bit.
119093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(
119193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                newNetworkWithHasEverConnectedTrue.networkId);
119293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Adding a new network should not have hasEverConnected set to true.",
119393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
119493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
119593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
119693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
119793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
119893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify that setting HasEverConnected with a config update can be read back.
119993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
120093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
120193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateConfigToHasEverConnectedTrue() throws Exception {
120293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        addNetwork(BASE_HAS_EVER_CONNECTED_CONFIG);
120393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
120493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Get the newly saved config and update HasEverConnected
120593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(
120693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
120793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Adding a new network should not have hasEverConnected set to true.",
120893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
120993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkConfig.getNetworkSelectionStatus().setHasEverConnected(true);
121093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(checkConfig, HAS_EVER_CONNECTED_USER);
121193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
121293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // verify that HasEverConnected was properly written and read back
121393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedTrue(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
121493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
121593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
121693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
121793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
121893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config preSharedKey is updated.
121993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
122093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
122193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdatePreSharedKeyClearsHasEverConnected() throws Exception {
122293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
122393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
122493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
122593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
122693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration original = mWifiConfigManager.getWifiConfiguration(
122793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
122893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
122993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updatePreSharedKeyConfig = new WifiConfiguration();
123093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updatePreSharedKeyConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
123193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updatePreSharedKeyConfig.SSID = original.SSID;
123293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updatePreSharedKeyConfig.preSharedKey = "newpassword";
123393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(original);
123493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updatePreSharedKeyConfig,
123593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
123693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
123793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
123893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
123993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
124093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
124193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
124293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedKeyManagement is
124393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
124493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
124593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
124693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedKeyManagementChanged() throws Exception {
124793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
124893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
124993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
125093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
125193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedKeyManagementConfig = new WifiConfiguration();
125293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedKeyManagementConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
125393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedKeyManagementConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
125493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedKeyManagementConfig.allowedKeyManagement.set(KeyMgmt.WPA_PSK);
125593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
125693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
125793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedKeyManagementString = makeString(
125893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedKeyManagementConfig.allowedKeyManagement,
125993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.KeyMgmt.strings);
126093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
126193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                KeyMgmt.varName)).thenReturn(allowedKeyManagementString);
126293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
126393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
126493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedKeyManagementConfig,
126593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
126693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
126793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
126893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
126993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
127093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
127193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
127293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedProtocols is
127393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
127493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
127593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
127693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedProtocolsChanged() throws Exception {
127793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
127893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
127993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
128093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
128193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedProtocolsConfig = new WifiConfiguration();
128293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedProtocolsConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
128393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedProtocolsConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
128493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedProtocolsConfig.allowedProtocols.set(
128593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.Protocol.RSN);
128693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
128793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
128893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedProtocolsString = makeString(
128993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedProtocolsConfig.allowedProtocols,
129093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.Protocol.strings);
129193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
129293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                Protocol.varName)).thenReturn(allowedProtocolsString);
129393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
129493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
129593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedProtocolsConfig,
129693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
129793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
129893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
129993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
130093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
130193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
130293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
130393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedAuthAlgorithms is
130493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
130593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
130693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
130793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedAuthAlgorithmsChanged() throws Exception {
130893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
130993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
131093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
131193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
131293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedAuthAlgorithmsConfig = new WifiConfiguration();
131393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedAuthAlgorithmsConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
131493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedAuthAlgorithmsConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
131593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedAuthAlgorithmsConfig.allowedAuthAlgorithms.set(
131693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.AuthAlgorithm.SHARED);
131793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
131893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
131993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedAuthAlgorithmsString = makeString(
132093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedAuthAlgorithmsConfig.allowedAuthAlgorithms,
132193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.AuthAlgorithm.strings);
132293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
132393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                AuthAlgorithm.varName)).thenReturn(allowedAuthAlgorithmsString);
132493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
132593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
132693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedAuthAlgorithmsConfig,
132793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
132893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
132993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
133093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
133193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
133293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
133393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
133493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedPairwiseCiphers is
133593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
133693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
133793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
133893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedPairwiseCiphersChanged() throws Exception {
133993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
134093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
134193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
134293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
134393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedPairwiseCiphersConfig = new WifiConfiguration();
134493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedPairwiseCiphersConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
134593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedPairwiseCiphersConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
134693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedPairwiseCiphersConfig.allowedPairwiseCiphers.set(
134793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.PairwiseCipher.CCMP);
134893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
134993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
135093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedPairwiseCiphersString = makeString(
135193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedPairwiseCiphersConfig.allowedPairwiseCiphers,
135293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.PairwiseCipher.strings);
135393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
135493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                PairwiseCipher.varName)).thenReturn(allowedPairwiseCiphersString);
135593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
135693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
135793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedPairwiseCiphersConfig,
135893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
135993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
136093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
136193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
136293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
136393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
136493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
136593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config allowedGroupCiphers is
136693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
136793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
136893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
136993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateAllowedGroupCiphersChanged() throws Exception {
137093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
137193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
137293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
137393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
137493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateAllowedGroupCiphersConfig = new WifiConfiguration();
137593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedGroupCiphersConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
137693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedGroupCiphersConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
137793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateAllowedGroupCiphersConfig.allowedGroupCiphers.set(
137893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.GroupCipher.CCMP);
137993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
138093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
138193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String allowedGroupCiphersString = makeString(
138293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                updateAllowedGroupCiphersConfig.allowedGroupCiphers,
138393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                    WifiConfiguration.GroupCipher.strings);
138493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
138593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                GroupCipher.varName)).thenReturn(allowedGroupCiphersString);
138693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
138793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
138893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateAllowedGroupCiphersConfig,
138993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
139093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
139193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
139293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
139393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
139493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
139593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
139693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config wepKeys is
139793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
139893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
139993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
140093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateWepKeysChanged() throws Exception {
140193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
140293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
140393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
140493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
140593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        String tempKey = "hereisakey";
140693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateWepKeysConfig = new WifiConfiguration();
140793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateWepKeysConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
140893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateWepKeysConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
140993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateWepKeysConfig.wepKeys = new String[] {tempKey};
141093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
141193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
141293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
141393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.wepKeyVarNames[0])).thenReturn(tempKey);
141493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
141593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
141693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateWepKeysConfig,
141793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
141893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
141993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
142093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
142193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
142293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
142393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
142493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config hiddenSSID is
142593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
142693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
142793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
142893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateHiddenSSIDChanged() throws Exception {
142993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
143093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
143193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
143293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
143393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateHiddenSSIDConfig = new WifiConfiguration();
143493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateHiddenSSIDConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
143593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateHiddenSSIDConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
143693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateHiddenSSIDConfig.hiddenSSID = true;
143793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
143893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
143993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
144093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                WifiConfiguration.hiddenSSIDVarName)).thenReturn("1");
144193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
144293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
144393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateHiddenSSIDConfig,
144493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
144593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
144693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
144793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
144893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
144993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
145093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
145193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verifies that hasEverConnected is cleared when a network config pmfVarName is
145293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * updated.
145393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
145493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
145593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testUpdateRequirePMFChanged() throws Exception {
145693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        final int originalUserId = mWifiConfigManager.getCurrentUserId();
145793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
145893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        testUpdateConfigToHasEverConnectedTrue();
145993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
146093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration updateRequirePMFConfig = new WifiConfiguration();
146193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateRequirePMFConfig.networkId = BASE_HAS_EVER_CONNECTED_CONFIG.networkId;
146293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateRequirePMFConfig.SSID = BASE_HAS_EVER_CONNECTED_CONFIG.SSID;
146393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        updateRequirePMFConfig.requirePMF = true;
146493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
146593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Set up mock to allow the new value to be read back into the config
146693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // TODO: please see b/28088226  - this test is implemented as if WifiConfigStore correctly
146793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // read back the boolean value.  When fixed, uncomment the following line and the
146893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // checkHasEverConnectedFalse below.
146993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        //when(mWifiNative.getNetworkVariable(BASE_HAS_EVER_CONNECTED_CONFIG.networkId,
147093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        //        WifiConfiguration.pmfVarName)).thenReturn("2");
147193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
147293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUserToCreatorOrParentOf(BASE_HAS_EVER_CONNECTED_CONFIG);
147393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        mWifiConfigManager.addOrUpdateNetwork(updateRequirePMFConfig,
147493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
147593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
147693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        //checkHasEverConnectedFalse(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
147793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        checkHasEverConnectedTrue(BASE_HAS_EVER_CONNECTED_CONFIG.networkId);
147893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        switchUser(originalUserId);
147993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
148093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
148193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
148293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig changes are detected in WifiConfigManager.
148393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
148493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
148593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testEnterpriseConfigAdded() {
148693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
148793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
148893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
148993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
149093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
149193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(null, eapConfig.enterpriseConfig));
149293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
149393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
149493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
149593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig eap change is detected.
149693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
149793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
149893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testEnterpriseConfigEapChangeDetected() {
149993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig = new EnterpriseConfig(Eap.TTLS);
150093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig peapConfig = new EnterpriseConfig(Eap.PEAP);
150193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
150293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
150393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                peapConfig.enterpriseConfig));
150493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
150593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
150693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
150793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig phase2 method change is detected.
150893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
150993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
151093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testEnterpriseConfigPhase2ChangeDetected() {
151193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig = new EnterpriseConfig(Eap.TTLS).setPhase2(Phase2.MSCHAPV2);
151293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig papConfig = new EnterpriseConfig(Eap.TTLS).setPhase2(Phase2.PAP);
151393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
151493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
151593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                papConfig.enterpriseConfig));
151693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
151793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
151893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
151993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig added Certificate is detected.
152093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
152193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
152293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testCaCertificateAddedDetected() {
152393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigNoCerts =  new EnterpriseConfig(Eap.TTLS)
152493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
152593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password");
152693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
152793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig1Cert =  new EnterpriseConfig(Eap.TTLS)
152893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
152993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
153093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
153193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
153293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfigNoCerts.enterpriseConfig,
153393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfig1Cert.enterpriseConfig));
153493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
153593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
153693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
153793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig Certificate change is detected.
153893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
153993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
154093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testDifferentCaCertificateDetected() {
154193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
154293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
154393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
154493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
154593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
154693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigNewCert =  new EnterpriseConfig(Eap.TTLS)
154793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
154893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
154993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT1});
155093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
155193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
155293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfigNewCert.enterpriseConfig));
155393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
155493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
155593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
155693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify WifiEnterpriseConfig added Certificate changes are detected.
155793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
155893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
155993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testCaCertificateChangesDetected() {
156093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
156193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
156293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
156393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0});
156493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
156593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigAddedCert =  new EnterpriseConfig(Eap.TTLS)
156693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
156793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
156893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
156993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
157093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
157193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfigAddedCert.enterpriseConfig));
157293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
157393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
157493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
157593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     * Verify that WifiEnterpriseConfig does not detect changes for identical configs.
157693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
157793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    @Test
157893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    public void testWifiEnterpriseConfigNoChanges() {
157993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfig =  new EnterpriseConfig(Eap.TTLS)
158093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setPhase2(Phase2.MSCHAPV2)
158193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setIdentity("username", "password")
158293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                .setCaCerts(new X509Certificate[] {FakeKeys.CA_CERT0, FakeKeys.CA_CERT1});
158393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
158493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // Just to be clear that check is not against the same object
158593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        EnterpriseConfig eapConfigSame =  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        assertFalse(mWifiConfigManager.wasEnterpriseConfigChange(eapConfig.enterpriseConfig,
159193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                eapConfigSame.enterpriseConfig));
159293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
159393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
159493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
159593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private void checkHasEverConnectedTrue(int networkId) {
159693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(networkId);
159793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertTrue("hasEverConnected expected to be true.",
159893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
159993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
160093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
160193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private void checkHasEverConnectedFalse(int networkId) {
160293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        WifiConfiguration checkConfig = mWifiConfigManager.getWifiConfiguration(networkId);
160393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        assertFalse("Updating credentials network config should clear hasEverConnected.",
160493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein                checkConfig.getNetworkSelectionStatus().getHasEverConnected());
160593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
160693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
160793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    /**
160893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     *  Helper function to translate from WifiConfiguration BitSet to String.
160993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein     */
161093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    private static String makeString(BitSet set, String[] strings) {
161193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        StringBuffer buf = new StringBuffer();
161293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        int nextSetBit = -1;
161393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
161493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        /* Make sure all set bits are in [0, strings.length) to avoid
161593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein         * going out of bounds on strings.  (Shouldn't happen, but...) */
161693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        set = set.get(0, strings.length);
161793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
161893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        while ((nextSetBit = set.nextSetBit(nextSetBit + 1)) != -1) {
161993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            buf.append(strings[nextSetBit].replace('_', '-')).append(' ');
162093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        }
162193332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
162293332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        // remove trailing space
162393332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        if (set.cardinality() > 0) {
162493332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein            buf.setLength(buf.length() - 1);
162593332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        }
162693332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
162793332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein        return buf.toString();
162893332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein    }
162993332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
163093332917bf29ddbe853a495816e486150f49da40Rebecca Silberstein
1631fbb081b7c28c18f0644701061a1ab38a4627db27Bartosz Fabianowski}
1632