1dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu/*
2dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * Copyright (C) 2016 The Android Open Source Project
3dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu *
4dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License");
5dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * you may not use this file except in compliance with the License.
6dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * You may obtain a copy of the License at
7dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu *
8dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu *      http://www.apache.org/licenses/LICENSE-2.0
9dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu *
10dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * Unless required by applicable law or agreed to in writing, software
11dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS,
12dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * See the License for the specific language governing permissions and
14dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * limitations under the License.
15dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu */
16dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
17dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiupackage com.android.server.wifi.hotspot2;
18dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
1987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport static org.junit.Assert.assertEquals;
20dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiuimport static org.junit.Assert.assertFalse;
21dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiuimport static org.junit.Assert.assertTrue;
22ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport static org.mockito.Mockito.verify;
23ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport static org.mockito.Mockito.when;
24ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport static org.mockito.MockitoAnnotations.initMocks;
25dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
2687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport android.net.wifi.EAPConstants;
2779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiuimport android.net.wifi.WifiConfiguration;
2879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiuimport android.net.wifi.WifiEnterpriseConfig;
29dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiuimport android.net.wifi.hotspot2.PasspointConfiguration;
30ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport android.net.wifi.hotspot2.pps.Credential;
31260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiuimport android.net.wifi.hotspot2.pps.HomeSp;
327f2a1e30dd5d14320ffc7b185ac25fdb79fe52b0Etan Cohenimport android.support.test.filters.SmallTest;
3379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiuimport android.util.Base64;
34dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
35ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport com.android.server.wifi.FakeKeys;
3687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.IMSIParameter;
3787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.SIMAccessor;
38ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport com.android.server.wifi.WifiKeyStore;
3987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.ANQPElement;
4087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.CellularNetwork;
4187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType;
4287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.DomainNameElement;
4387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.NAIRealmData;
4487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.NAIRealmElement;
4587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.RoamingConsortiumElement;
4687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.ThreeGPPNetworkElement;
4787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.eap.AuthParam;
4887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.eap.EAPMethod;
4987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport com.android.server.wifi.hotspot2.anqp.eap.NonEAPInnerAuth;
50ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
512e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honmaimport com.android.server.wifi.util.InformationElementUtil.RoamingConsortium;
52ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport org.junit.Before;
53dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiuimport org.junit.Test;
54ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport org.mockito.Mock;
55ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
5679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiuimport java.nio.charset.StandardCharsets;
57ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport java.security.MessageDigest;
58ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiuimport java.security.cert.X509Certificate;
5987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.Arrays;
6087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.HashMap;
6187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.HashSet;
6287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.Map;
6387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiuimport java.util.Set;
64dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
65dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu/**
66dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu * Unit tests for {@link com.android.server.wifi.hotspot2.PasspointProvider}.
67dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu */
68dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu@SmallTest
69dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiupublic class PasspointProviderTest {
70ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    private static final long PROVIDER_ID = 12L;
7107816a4745b8030911869ceb58fa735e47834fe4Peter Qiu    private static final int CREATOR_UID = 1234;
728c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu    private static final String CA_CERTIFICATE_NAME = "CACERT_HS2_12";
738c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu    private static final String CLIENT_CERTIFICATE_NAME = "USRCERT_HS2_12";
748c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu    private static final String CLIENT_PRIVATE_KEY_NAME = "USRPKEY_HS2_12";
758c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu    private static final String CA_CERTIFICATE_ALIAS = "HS2_12";
768c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu    private static final String CLIENT_CERTIFICATE_ALIAS = "HS2_12";
778c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu    private static final String CLIENT_PRIVATE_KEY_ALIAS = "HS2_12";
78ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
79ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    @Mock WifiKeyStore mKeyStore;
8087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Mock SIMAccessor mSimAccessor;
812e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    @Mock RoamingConsortium mRoamingConsortium;
82dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    PasspointProvider mProvider;
83dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
84ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    /** Sets up test. */
85ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    @Before
86ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    public void setUp() throws Exception {
87ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        initMocks(this);
882e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        when(mRoamingConsortium.getRoamingConsortiums()).thenReturn(null);
89ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    }
90ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
91ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    /**
92ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * Helper function for creating a provider instance for testing.
93ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     *
94ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * @param config The configuration associated with the provider
95ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * @return {@link com.android.server.wifi.hotspot2.PasspointProvider}
96ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     */
97ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    private PasspointProvider createProvider(PasspointConfiguration config) {
9807816a4745b8030911869ceb58fa735e47834fe4Peter Qiu        return new PasspointProvider(config, mKeyStore, mSimAccessor, PROVIDER_ID, CREATOR_UID);
99ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    }
100ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
101dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    /**
102dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * Verify that the configuration associated with the provider is the same or not the same
103dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * as the expected configuration.
104dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     *
105dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * @param expectedConfig The expected configuration
106dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * @param equals Flag indicating equality or inequality check
107dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     */
108dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    private void verifyInstalledConfig(PasspointConfiguration expectedConfig, boolean equals) {
109dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        PasspointConfiguration actualConfig = mProvider.getConfig();
110dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        if (equals) {
111dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu            assertTrue(actualConfig.equals(expectedConfig));
112dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        } else {
113dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu            assertFalse(actualConfig.equals(expectedConfig));
114dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        }
115dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    }
116dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
117dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    /**
11887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Helper function for creating a Domain Name ANQP element.
11987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
12087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param domains List of domain names
12187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @return {@link DomainNameElement}
12287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
12387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    private DomainNameElement createDomainNameElement(String[] domains) {
12487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        return new DomainNameElement(Arrays.asList(domains));
12587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
12687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
12787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
12887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Helper function for creating a NAI Realm ANQP element.
12987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
13087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param realm The realm of the network
13187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param eapMethodID EAP Method ID
13287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param authParam Authentication parameter
13387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @return {@link NAIRealmElement}
13487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
13587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    private NAIRealmElement createNAIRealmElement(String realm, int eapMethodID,
13687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu            AuthParam authParam) {
13787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<Integer, Set<AuthParam>> authParamMap = new HashMap<>();
13887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        if (authParam != null) {
13987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu            Set<AuthParam> authSet = new HashSet<>();
14087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu            authSet.add(authParam);
14187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu            authParamMap.put(authParam.getAuthTypeID(), authSet);
14287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        }
14387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        EAPMethod eapMethod = new EAPMethod(eapMethodID, authParamMap);
14487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        NAIRealmData realmData = new NAIRealmData(Arrays.asList(new String[] {realm}),
14587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                Arrays.asList(new EAPMethod[] {eapMethod}));
14687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        return new NAIRealmElement(Arrays.asList(new NAIRealmData[] {realmData}));
14787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
14887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
14987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
15087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Helper function for creating a Roaming Consortium ANQP element.
15187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
15287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param rcOIs Roaming consortium OIs
15387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @return {@link RoamingConsortiumElement}
15487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
15587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    private RoamingConsortiumElement createRoamingConsortiumElement(Long[] rcOIs) {
15687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        return new RoamingConsortiumElement(Arrays.asList(rcOIs));
15787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
15887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
15987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
16087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Helper function for creating a 3GPP Network ANQP element.
16187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
16287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @param imsiList List of IMSI to be included in a 3GPP Network
16387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @return {@link ThreeGPPNetworkElement}
16487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
16587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    private ThreeGPPNetworkElement createThreeGPPNetworkElement(String[] imsiList) {
16687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        CellularNetwork network = new CellularNetwork(Arrays.asList(imsiList));
16787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        return new ThreeGPPNetworkElement(Arrays.asList(new CellularNetwork[] {network}));
16887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
16987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
17087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
171dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * Verify that modification to the configuration used for creating PasspointProvider
172dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * will not change the configuration stored inside the PasspointProvider.
173dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     *
174dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * @throws Exception
175dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     */
176dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    @Test
177dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    public void verifyModifyOriginalConfig() throws Exception {
178dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        // Create a dummy PasspointConfiguration.
179dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
180260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
1814f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn("test1");
1824f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
1834f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
1844f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(new Credential.UserCredential());
1854f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
186ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        mProvider = createProvider(config);
187dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        verifyInstalledConfig(config, true);
188dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
189dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        // Modify the original configuration, the configuration maintained by the provider
190dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        // should be unchanged.
1914f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.getHomeSp().setFqdn("test2");
192dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        verifyInstalledConfig(config, false);
193dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    }
194dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
195dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    /**
196dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * Verify that modification to the configuration retrieved from the PasspointProvider
197dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * will not change the configuration stored inside the PasspointProvider.
198dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     *
199dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     * @throws Exception
200dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu     */
201dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    @Test
202dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    public void verifyModifyRetrievedConfig() throws Exception {
203dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        // Create a dummy PasspointConfiguration.
204dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
205260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
2064f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn("test1");
2074f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
2084f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
2094f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(new Credential.UserCredential());
2104f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
211ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        mProvider = createProvider(config);
212dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        verifyInstalledConfig(config, true);
213dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu
214dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        // Modify the retrieved configuration, verify the configuration maintained by the
215dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        // provider should be unchanged.
216dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        PasspointConfiguration retrievedConfig = mProvider.getConfig();
2174f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        retrievedConfig.getHomeSp().setFqdn("test2");
218dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu        verifyInstalledConfig(retrievedConfig, false);
219dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu    }
220ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
221ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    /**
222ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * Verify a successful installation of certificates and key.
223ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     *
224ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * @throws Exception
225ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     */
226ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    @Test
227ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    public void installCertsAndKeysSuccess() throws Exception {
228ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Create a dummy configuration with certificate credential.
229ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        PasspointConfiguration config = new PasspointConfiguration();
2304f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
2314f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
2324f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        certCredential.setCertSha256Fingerprint(
2334f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu                MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
2344f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCertCredential(certCredential);
2354f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCaCertificate(FakeKeys.CA_CERT0);
2364f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientPrivateKey(FakeKeys.RSA_KEY1);
2374f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientCertificateChain(new X509Certificate[] {FakeKeys.CLIENT_CERT});
2384f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
239ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        mProvider = createProvider(config);
240ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
241ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Install client certificate and key to the keystore successfully.
2428c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CA_CERTIFICATE_NAME, FakeKeys.CA_CERT0))
243ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
2448c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putKeyInKeyStore(CLIENT_PRIVATE_KEY_NAME, FakeKeys.RSA_KEY1))
245ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
2468c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CLIENT_CERTIFICATE_NAME, FakeKeys.CLIENT_CERT))
247ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
248ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.installCertsAndKeys());
249ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
250ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Verify client certificate and key in the configuration gets cleared and aliases
251ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // are set correctly.
252ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        PasspointConfiguration curConfig = mProvider.getConfig();
2534f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        assertTrue(curConfig.getCredential().getCaCertificate() == null);
2544f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        assertTrue(curConfig.getCredential().getClientPrivateKey() == null);
2554f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        assertTrue(curConfig.getCredential().getClientCertificateChain() == null);
256ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getCaCertificateAlias().equals(CA_CERTIFICATE_ALIAS));
257ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientPrivateKeyAlias().equals(CLIENT_PRIVATE_KEY_ALIAS));
258ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientCertificateAlias().equals(CLIENT_CERTIFICATE_ALIAS));
259ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    }
260ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
261ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    /**
262ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * Verify a failure installation of certificates and key.
263ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     *
264ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * @throws Exception
265ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     */
266ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    @Test
267ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    public void installCertsAndKeysFailure() throws Exception {
268ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Create a dummy configuration with certificate credential.
269ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        PasspointConfiguration config = new PasspointConfiguration();
2704f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
2714f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
2724f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        certCredential.setCertSha256Fingerprint(
2734f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu                MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
2744f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCertCredential(certCredential);
2754f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCaCertificate(FakeKeys.CA_CERT0);
2764f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientPrivateKey(FakeKeys.RSA_KEY1);
2774f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientCertificateChain(new X509Certificate[] {FakeKeys.CLIENT_CERT});
2784f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
279ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        mProvider = createProvider(config);
280ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
281ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Failed to install client certificate to the keystore.
2828c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CA_CERTIFICATE_NAME, FakeKeys.CA_CERT0))
283ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
2848c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putKeyInKeyStore(CLIENT_PRIVATE_KEY_NAME, FakeKeys.RSA_KEY1))
285ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
2868c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CLIENT_CERTIFICATE_NAME, FakeKeys.CLIENT_CERT))
287ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(false);
288ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertFalse(mProvider.installCertsAndKeys());
289ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
290ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Verify certificates and key in the configuration are not cleared and aliases
291ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // are not set.
292ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        PasspointConfiguration curConfig = mProvider.getConfig();
2934f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        assertTrue(curConfig.getCredential().getCaCertificate() != null);
2944f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        assertTrue(curConfig.getCredential().getClientCertificateChain() != null);
2954f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        assertTrue(curConfig.getCredential().getClientPrivateKey() != null);
296ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getCaCertificateAlias() == null);
297ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientPrivateKeyAlias() == null);
298ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientCertificateAlias() == null);
299ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    }
300ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
301ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    /**
302ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     * Verify a successful uninstallation of certificates and key.
303ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu     */
304ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    @Test
305ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    public void uninstallCertsAndKeys() throws Exception {
306ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Create a dummy configuration with certificate credential.
307ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        PasspointConfiguration config = new PasspointConfiguration();
3084f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
3094f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
3104f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        certCredential.setCertSha256Fingerprint(
3114f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu                MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
3124f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCertCredential(certCredential);
3134f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCaCertificate(FakeKeys.CA_CERT0);
3144f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientPrivateKey(FakeKeys.RSA_KEY1);
3154f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientCertificateChain(new X509Certificate[] {FakeKeys.CLIENT_CERT});
3164f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
317ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        mProvider = createProvider(config);
318ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
319ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Install client certificate and key to the keystore successfully.
3208c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CA_CERTIFICATE_NAME, FakeKeys.CA_CERT0))
321ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
3228c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putKeyInKeyStore(CLIENT_PRIVATE_KEY_NAME, FakeKeys.RSA_KEY1))
323ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
3248c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CLIENT_CERTIFICATE_NAME, FakeKeys.CLIENT_CERT))
325ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu                .thenReturn(true);
326ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.installCertsAndKeys());
327ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getCaCertificateAlias().equals(CA_CERTIFICATE_ALIAS));
328ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientPrivateKeyAlias().equals(CLIENT_PRIVATE_KEY_ALIAS));
329ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientCertificateAlias().equals(CLIENT_CERTIFICATE_ALIAS));
330ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu
331ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        // Uninstall certificates and key from the keystore.
332ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        mProvider.uninstallCertsAndKeys();
3338c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        verify(mKeyStore).removeEntryFromKeyStore(CA_CERTIFICATE_NAME);
3348c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        verify(mKeyStore).removeEntryFromKeyStore(CLIENT_CERTIFICATE_NAME);
3358c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        verify(mKeyStore).removeEntryFromKeyStore(CLIENT_PRIVATE_KEY_NAME);
336ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getCaCertificateAlias() == null);
337ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientPrivateKeyAlias() == null);
338ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu        assertTrue(mProvider.getClientCertificateAlias() == null);
339ae791278c9032a8b10cf818b98b571c0396add4aPeter Qiu    }
34087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
34187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
34287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a home provider when its FQDN matches a domain name in the
34387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Domain Name ANQP element and no NAI realm is provided.
34487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
34587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
34687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
34787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
34887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchFQDNWithoutNAIRealm() throws Exception {
34987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testDomain = "test.com";
35087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
35187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
35287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
353260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
3544f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(testDomain);
3554f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
3564f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
3574f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
3585e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
3594f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(userCredential);
3604f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
36187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
36287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
36387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup ANQP elements.
36487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
36587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPDomName,
36687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createDomainNameElement(new String[] {testDomain}));
36787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
3682e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.HomeProvider,
3692e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
37087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
37187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
37287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
37387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a home provider when its FQDN matches a domain name in the
37487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Domain Name ANQP element and the provider's credential matches the NAI realm provided.
37587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
37687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
37787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
37887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
37987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchFQDNWithNAIRealmMatch() throws Exception {
38087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testDomain = "test.com";
38187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testRealm = "realm.com";
38287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
38387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
38487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
385260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
3864f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(testDomain);
3874f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
3884f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
3894f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setRealm(testRealm);
3904f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
3915e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
3924f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(userCredential);
3934f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
39487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
39587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
39687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup Domain Name ANQP element.
39787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
39887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPDomName,
39987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createDomainNameElement(new String[] {testDomain}));
40087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPNAIRealm,
40187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createNAIRealmElement(testRealm, EAPConstants.EAP_TTLS,
40287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                        new NonEAPInnerAuth(NonEAPInnerAuth.AUTH_TYPE_MSCHAPV2)));
40387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
4042e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.HomeProvider,
4052e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
40687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
40787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
40887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
40987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that there is no match when the provider's FQDN matches a domain name in the
41087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Domain Name ANQP element but the provider's credential doesn't match the authentication
41187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * method provided in the NAI realm.
41287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
41387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
41487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
41587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
41687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchFQDNWithNAIRealmMismatch() throws Exception {
41787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testDomain = "test.com";
41887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testRealm = "realm.com";
41987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
42087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
42187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
422260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
4234f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(testDomain);
4244f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
4254f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
4264f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setRealm(testRealm);
4274f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
4285e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
4294f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(userCredential);
4304f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
43187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
43287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
43387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup Domain Name ANQP element.
43487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
43587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPDomName,
43687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createDomainNameElement(new String[] {testDomain}));
43787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPNAIRealm,
43887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createNAIRealmElement(testRealm, EAPConstants.EAP_TLS, null));
43987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
4402e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.None, mProvider.match(anqpElementMap, mRoamingConsortium));
44187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
44287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
44387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
44487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a home provider when its SIM credential matches an 3GPP network
44587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * domain name in the Domain Name ANQP element.
44687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
44787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
44887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
44987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
45087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void match3GPPNetworkDomainName() throws Exception {
45187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testImsi = "1234567890";
45287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
45387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
45487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
455260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        config.setHomeSp(new HomeSp());
4564f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
4574f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
4584f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        simCredential.setImsi(testImsi);
4594f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setSimCredential(simCredential);
4604f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
46187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        when(mSimAccessor.getMatchingImsis(new IMSIParameter(testImsi, false)))
46287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                .thenReturn(Arrays.asList(new String[] {testImsi}));
46387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
46487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
46587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup Domain Name ANQP element.
46687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
46787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPDomName,
46887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createDomainNameElement(new String[] {"wlan.mnc456.mcc123.3gppnetwork.org"}));
46987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
4702e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.HomeProvider,
4712e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
47287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
47387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
47487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
47587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a roaming provider when a roaming consortium OI matches an OI
47687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * in the roaming consortium ANQP element.
47787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
47887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
47987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
48087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
48187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchRoamingConsortium() throws Exception {
48287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        long[] providerRCOIs = new long[] {0x1234L, 0x2345L};
48387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Long[] anqpRCOIs = new Long[] {0x1234L, 0x2133L};
48487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
48587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
48687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
487260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
488260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        homeSp.setRoamingConsortiumOis(providerRCOIs);
4894f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
4904f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
4914f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
4925e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
4934f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(userCredential);
4944f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
49587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
49687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
49787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup Roaming Consortium ANQP element.
49887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
49987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPRoamingConsortium,
50087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createRoamingConsortiumElement(anqpRCOIs));
50187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
5022e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.RoamingProvider,
5032e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
5042e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    }
5052e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5062e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    /**
5072e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * Verify that a provider is a roaming provider when a roaming consortium OI matches an OI
5082e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * in the roaming consortium information element.
5092e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     *
5102e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * @throws Exception
5112e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     */
5122e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    @Test
5132e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    public void matchRoamingConsortiumIe() throws Exception {
5142e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        long[] providerRCOIs = new long[] {0x1234L, 0x2345L};
5152e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        long[] ieRCOIs = new long[] {0x1234L, 0x2133L};
5162e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5172e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        // Setup test provider.
5182e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        PasspointConfiguration config = new PasspointConfiguration();
5192e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        HomeSp homeSp = new HomeSp();
5202e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        homeSp.setRoamingConsortiumOis(providerRCOIs);
5212e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        config.setHomeSp(homeSp);
5222e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        Credential credential = new Credential();
5232e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        Credential.UserCredential userCredential = new Credential.UserCredential();
5242e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
5252e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        credential.setUserCredential(userCredential);
5262e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        config.setCredential(credential);
5272e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        mProvider = createProvider(config);
5282e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5292e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        // Setup Roaming Consortium ANQP element.
5302e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
5312e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5322e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        // Setup Roaming Consortium Information element.
5332e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        when(mRoamingConsortium.getRoamingConsortiums()).thenReturn(ieRCOIs);
5342e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5352e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.RoamingProvider,
5362e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
5372e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    }
5382e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5392e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    /**
5402e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * Verify that none of matched providers are not found when a roaming consortium OI doesn't
5412e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * matches an OI in the roaming consortium information element and
5422e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * none of NAI realms match each other.
5432e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     *
5442e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     * @throws Exception
5452e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma     */
5462e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    @Test
5472e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma    public void misMatchForRoamingConsortiumIeAndNAIRealm() throws Exception {
5482e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        long[] providerRCOIs = new long[] {0x1234L, 0x2345L};
5492e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        long[] ieRCOIs = new long[] {0x2255L, 0x2133L};
5502e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5512e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        // Setup test provider.
5522e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        PasspointConfiguration config = new PasspointConfiguration();
5532e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        HomeSp homeSp = new HomeSp();
5542e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        homeSp.setRoamingConsortiumOis(providerRCOIs);
5552e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        config.setHomeSp(homeSp);
5562e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        Credential credential = new Credential();
5572e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        Credential.UserCredential userCredential = new Credential.UserCredential();
5582e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
5592e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        credential.setUserCredential(userCredential);
5602e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        config.setCredential(credential);
5612e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        mProvider = createProvider(config);
5622e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5632e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        // Setup Roaming Consortium ANQP element.
5642e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
5652e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5662e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        // Setup Roaming Consortium Information element.
5672e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        when(mRoamingConsortium.getRoamingConsortiums()).thenReturn(ieRCOIs);
5682e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma
5692e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.None,
5702e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
57187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
57287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
57387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
57487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a roaming provider when the provider's IMSI parameter and an
57587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * IMSI from the SIM card matches a MCC-MNC in the 3GPP Network ANQP element.
57687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
57787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
57887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
57987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
58087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchThreeGPPNetwork() throws Exception {
58187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testImsi = "1234567890";
58287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
58387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
58487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
585260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        config.setHomeSp(new HomeSp());
5864f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
5874f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
5884f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        simCredential.setImsi(testImsi);
5894f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setSimCredential(simCredential);
5904f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
59187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        when(mSimAccessor.getMatchingImsis(new IMSIParameter(testImsi, false)))
59287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                .thenReturn(Arrays.asList(new String[] {testImsi}));
59387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
59487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
59587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup 3GPP Network ANQP element.
59687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
59787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQP3GPPNetwork,
59887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createThreeGPPNetworkElement(new String[] {"123456"}));
59987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
6002e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.RoamingProvider,
6012e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
60287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
60387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
60487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
60587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a roaming provider when its credential matches a NAI realm in
60687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * the NAI Realm ANQP element.
60787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
60887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
60987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
61087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
61187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchNAIRealm() throws Exception {
61287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testRealm = "realm.com";
61387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
61487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
61587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
616260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        config.setHomeSp(new HomeSp());
6174f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
6184f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setRealm(testRealm);
6194f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
6205e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
6214f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(userCredential);
6224f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
62387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
62487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
62587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup NAI Realm ANQP element.
62687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
62787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPNAIRealm,
62887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createNAIRealmElement(testRealm, EAPConstants.EAP_TTLS,
62987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                        new NonEAPInnerAuth(NonEAPInnerAuth.AUTH_TYPE_MSCHAPV2)));
63087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
6312e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.RoamingProvider,
6322e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
63387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
63487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
63587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    /**
63687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * Verify that a provider is a home provider when its FQDN, roaming consortium OI, and
63787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * IMSI all matched against the ANQP elements, since we prefer matching home provider over
63887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * roaming provider.
63987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     *
64087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     * @throws Exception
64187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu     */
64287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    @Test
64387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    public void matchHomeOverRoamingProvider() throws Exception {
64487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test data.
64587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testDomain = "test.com";
64687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        String testImsi = "1234567890";
64787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        long[] providerRCOIs = new long[] {0x1234L, 0x2345L};
64887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Long[] anqpRCOIs = new Long[] {0x1234L, 0x2133L};
64987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
65087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup test provider.
65187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
652260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
6534f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(testDomain);
654260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        homeSp.setRoamingConsortiumOis(providerRCOIs);
6554f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
6564f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
6574f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
6584f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        simCredential.setImsi(testImsi);
6594f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setSimCredential(simCredential);
6604f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
66187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        when(mSimAccessor.getMatchingImsis(new IMSIParameter(testImsi, false)))
66287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                .thenReturn(Arrays.asList(new String[] {testImsi}));
66387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        mProvider = createProvider(config);
66487c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
66587c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        // Setup ANQP elements.
66687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        Map<ANQPElementType, ANQPElement> anqpElementMap = new HashMap<>();
66787c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPDomName,
66887c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createDomainNameElement(new String[] {testDomain}));
66987c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQPRoamingConsortium,
67087c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createRoamingConsortiumElement(anqpRCOIs));
67187c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu        anqpElementMap.put(ANQPElementType.ANQP3GPPNetwork,
67287c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu                createThreeGPPNetworkElement(new String[] {"123456"}));
67387c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu
6742e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma        assertEquals(PasspointMatch.HomeProvider,
6752e889dc0b3f348f45cc5f5006d8784bed30583a9Masashi Honma            mProvider.match(anqpElementMap, mRoamingConsortium));
67687c6f1b149804685e46c18d2ad11262f611c9255Peter Qiu    }
67779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
67879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    /**
67979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * Verify that an expected WifiConfiguration will be returned for a Passpoint provider
68079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * with an user credential.
68179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     *
68279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * @throws Exception
68379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     */
68479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    @Test
68579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    public void getWifiConfigWithUserCredential() throws Exception {
68679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Test data.
68779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String fqdn = "test.com";
68879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String friendlyName = "Friendly Name";
68979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
69079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String realm = "realm.com";
69179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String username = "username";
69279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String password = "password";
69379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        byte[] base64EncodedPw =
69479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu                Base64.encode(password.getBytes(StandardCharsets.UTF_8), Base64.DEFAULT);
69579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String encodedPasswordStr = new String(base64EncodedPw, StandardCharsets.UTF_8);
69679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
69779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Create provider.
69879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
699260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
7004f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(fqdn);
7014f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFriendlyName(friendlyName);
702260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
7034f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
7044f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
7054f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setRealm(realm);
7064f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
7074f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        userCredential.setUsername(username);
7084f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        userCredential.setPassword(encodedPasswordStr);
7095e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod(Credential.UserCredential.AUTH_METHOD_MSCHAPV2);
7104f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setUserCredential(userCredential);
7114f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCaCertificate(FakeKeys.CA_CERT0);
7124f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
71379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        mProvider = createProvider(config);
71479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
71579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Install certificate.
7168c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CA_CERTIFICATE_NAME, FakeKeys.CA_CERT0))
71779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu                .thenReturn(true);
71879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(mProvider.installCertsAndKeys());
71979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
72079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Retrieve the WifiConfiguration associated with the provider, and verify the content of
72179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // the configuration.  Need to verify field by field since WifiConfiguration doesn't
72279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // override equals() function.
72379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        WifiConfiguration wifiConfig = mProvider.getWifiConfig();
72479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        WifiEnterpriseConfig wifiEnterpriseConfig = wifiConfig.enterpriseConfig;
72579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(fqdn, wifiConfig.FQDN);
72679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(friendlyName, wifiConfig.providerFriendlyName);
72779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(Arrays.equals(rcOIs, wifiConfig.roamingConsortiumIds));
72879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(wifiConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP));
72979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(wifiConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
730773a24cc2db61d47cea3c86a3ca8276805536674Sohani Rao        assertFalse(wifiConfig.shared);
73179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(realm, wifiEnterpriseConfig.getRealm());
7322aa7cc7c13207c3afa3ef428ec1c8cdc1893c50cPeter Qiu        assertEquals(fqdn, wifiEnterpriseConfig.getDomainSuffixMatch());
73379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals("anonymous@" + realm, wifiEnterpriseConfig.getAnonymousIdentity());
73479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(WifiEnterpriseConfig.Eap.TTLS, wifiEnterpriseConfig.getEapMethod());
73579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(WifiEnterpriseConfig.Phase2.MSCHAPV2, wifiEnterpriseConfig.getPhase2Method());
73679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(username, wifiEnterpriseConfig.getIdentity());
73779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(password, wifiEnterpriseConfig.getPassword());
7388c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        assertEquals(CA_CERTIFICATE_ALIAS, wifiEnterpriseConfig.getCaCertificateAlias());
73979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    }
74079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
74179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    /**
74279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * Verify that an expected WifiConfiguration will be returned for a Passpoint provider
74379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * with a certificate credential.
74479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     *
74579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * @throws Exception
74679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     */
74779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    @Test
74879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    public void getWifiConfigWithCertCredential() throws Exception {
74979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Test data.
75079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String fqdn = "test.com";
75179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String friendlyName = "Friendly Name";
75279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
75379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String realm = "realm.com";
75479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
75579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Create provider.
75679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
757260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
7584f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(fqdn);
7594f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFriendlyName(friendlyName);
760260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
7614f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
7624f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
7634f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setRealm(realm);
7644f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
7654f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        certCredential.setCertSha256Fingerprint(
7664f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu                MessageDigest.getInstance("SHA-256").digest(FakeKeys.CLIENT_CERT.getEncoded()));
7674f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCertCredential(certCredential);
7684f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setCaCertificate(FakeKeys.CA_CERT0);
7694f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientPrivateKey(FakeKeys.RSA_KEY1);
7704f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setClientCertificateChain(new X509Certificate[] {FakeKeys.CLIENT_CERT});
7714f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
77279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        mProvider = createProvider(config);
77379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
77479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Install certificate.
7758c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CA_CERTIFICATE_NAME, FakeKeys.CA_CERT0))
77679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu                .thenReturn(true);
7778c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putKeyInKeyStore(CLIENT_PRIVATE_KEY_NAME, FakeKeys.RSA_KEY1))
77879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu                .thenReturn(true);
7798c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        when(mKeyStore.putCertInKeyStore(CLIENT_CERTIFICATE_NAME, FakeKeys.CLIENT_CERT))
78079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu                .thenReturn(true);
78179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(mProvider.installCertsAndKeys());
78279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
78379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Retrieve the WifiConfiguration associated with the provider, and verify the content of
78479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // the configuration.  Need to verify field by field since WifiConfiguration doesn't
78579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // override equals() function.
78679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        WifiConfiguration wifiConfig = mProvider.getWifiConfig();
78779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        WifiEnterpriseConfig wifiEnterpriseConfig = wifiConfig.enterpriseConfig;
78879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(fqdn, wifiConfig.FQDN);
78979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(friendlyName, wifiConfig.providerFriendlyName);
79079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(Arrays.equals(rcOIs, wifiConfig.roamingConsortiumIds));
79179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(wifiConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP));
79279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(wifiConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
793773a24cc2db61d47cea3c86a3ca8276805536674Sohani Rao        assertFalse(wifiConfig.shared);
79479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(realm, wifiEnterpriseConfig.getRealm());
7952aa7cc7c13207c3afa3ef428ec1c8cdc1893c50cPeter Qiu        assertEquals(fqdn, wifiEnterpriseConfig.getDomainSuffixMatch());
79679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals("anonymous@" + realm, wifiEnterpriseConfig.getAnonymousIdentity());
79779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(WifiEnterpriseConfig.Eap.TLS, wifiEnterpriseConfig.getEapMethod());
7988c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        assertEquals(CLIENT_CERTIFICATE_ALIAS, wifiEnterpriseConfig.getClientCertificateAlias());
7998c22a001ebe4537fe5c0da1112e256dbd9d55ae7Peter Qiu        assertEquals(CA_CERTIFICATE_ALIAS, wifiEnterpriseConfig.getCaCertificateAlias());
80079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    }
80179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
80279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    /**
80379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * Verify that an expected WifiConfiguration will be returned for a Passpoint provider
80479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * with a SIM credential.
80579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     *
80679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     * @throws Exception
80779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu     */
80879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    @Test
80979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    public void getWifiConfigWithSimCredential() throws Exception {
81079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Test data.
81179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String fqdn = "test.com";
81279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String friendlyName = "Friendly Name";
81379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
81479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String realm = "realm.com";
81579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        String imsi = "1234*";
81679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
81779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Create provider.
81879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
819260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        HomeSp homeSp = new HomeSp();
8204f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFqdn(fqdn);
8214f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        homeSp.setFriendlyName(friendlyName);
822260f8f7ab5595c36ab5d130441cabe3dc944830cPeter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
8234f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setHomeSp(homeSp);
8244f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential credential = new Credential();
8254f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setRealm(realm);
8264f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
8274f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        simCredential.setImsi(imsi);
8284f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        simCredential.setEapType(EAPConstants.EAP_SIM);
8294f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        credential.setSimCredential(simCredential);
8304f4d745ca28b915ea4a7c91ec5df3ea8a2db64adPeter Qiu        config.setCredential(credential);
83179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        mProvider = createProvider(config);
83279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu
83379b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // Retrieve the WifiConfiguration associated with the provider, and verify the content of
83479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // the configuration.  Need to verify field by field since WifiConfiguration doesn't
83579b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        // override equals() function.
83679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        WifiConfiguration wifiConfig = mProvider.getWifiConfig();
83779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        WifiEnterpriseConfig wifiEnterpriseConfig = wifiConfig.enterpriseConfig;
83879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(fqdn, wifiConfig.FQDN);
83979b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(friendlyName, wifiConfig.providerFriendlyName);
84079b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(Arrays.equals(rcOIs, wifiConfig.roamingConsortiumIds));
84179b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(wifiConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP));
84279b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertTrue(wifiConfig.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
843773a24cc2db61d47cea3c86a3ca8276805536674Sohani Rao        assertFalse(wifiConfig.shared);
84479b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(realm, wifiEnterpriseConfig.getRealm());
8452aa7cc7c13207c3afa3ef428ec1c8cdc1893c50cPeter Qiu        assertEquals(fqdn, wifiEnterpriseConfig.getDomainSuffixMatch());
84679b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(WifiEnterpriseConfig.Eap.SIM, wifiEnterpriseConfig.getEapMethod());
84779b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu        assertEquals(imsi, wifiEnterpriseConfig.getPlmn());
84879b81a96a2dd5ce45cb4b9206f04e4b37f7220f1Peter Qiu    }
8495e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
8505e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    /**
8515e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * Verify that an expected {@link PasspointConfiguration} will be returned when converting
8525e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * from a {@link WifiConfiguration} containing an user credential.
8535e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     *
8545e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * @throws Exception
8555e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     */
8565e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    @Test
8575e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    public void convertFromWifiConfigWithUserCredential() throws Exception {
8585e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Test data.
8595e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String fqdn = "test.com";
8605e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String friendlyName = "Friendly Name";
8615e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
8625e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String realm = "realm.com";
8635e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String username = "username";
8645e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String password = "password";
8655e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        byte[] base64EncodedPw =
8665e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu                Base64.encode(password.getBytes(StandardCharsets.UTF_8), Base64.DEFAULT);
8675e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String encodedPasswordStr = new String(base64EncodedPw, StandardCharsets.UTF_8);
8685e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
8695e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Setup WifiConfiguration for legacy Passpoint configuraiton.
8705e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        WifiConfiguration wifiConfig = new WifiConfiguration();
8715e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.FQDN = fqdn;
8725e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.providerFriendlyName = friendlyName;
8735e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.roamingConsortiumIds = rcOIs;
8745e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setIdentity(username);
8755e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setPassword(password);
8765e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setRealm(realm);
8775e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TTLS);
8785e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setPhase2Method(WifiEnterpriseConfig.Phase2.PAP);
8795e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
8805e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Setup expected {@link PasspointConfiguration}
8815e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        PasspointConfiguration passpointConfig = new PasspointConfiguration();
8825e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        HomeSp homeSp = new HomeSp();
8835e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setFqdn(fqdn);
8845e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setFriendlyName(friendlyName);
8855e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
8865e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.setHomeSp(homeSp);
8875e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Credential credential = new Credential();
8885e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Credential.UserCredential userCredential = new Credential.UserCredential();
8895e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setUsername(username);
8905e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setPassword(encodedPasswordStr);
8915e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setEapType(EAPConstants.EAP_TTLS);
8925e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        userCredential.setNonEapInnerMethod("PAP");
8935e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        credential.setUserCredential(userCredential);
8945e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        credential.setRealm(realm);
8955e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.setCredential(credential);
8965e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
8975e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertEquals(passpointConfig, PasspointProvider.convertFromWifiConfig(wifiConfig));
8985e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    }
8995e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9005e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    /**
9015e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * Verify that an expected {@link PasspointConfiguration} will be returned when converting
9025e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * from a {@link WifiConfiguration} containing a SIM credential.
9035e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     *
9045e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * @throws Exception
9055e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     */
9065e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    @Test
9075e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    public void convertFromWifiConfigWithSimCredential() throws Exception {
9085e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Test data.
9095e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String fqdn = "test.com";
9105e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String friendlyName = "Friendly Name";
9115e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
9125e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String realm = "realm.com";
9135e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String imsi = "1234";
9145e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9155e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Setup WifiConfiguration for legacy Passpoint configuraiton.
9165e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        WifiConfiguration wifiConfig = new WifiConfiguration();
9175e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.FQDN = fqdn;
9185e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.providerFriendlyName = friendlyName;
9195e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.roamingConsortiumIds = rcOIs;
9205e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setRealm(realm);
9215e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.SIM);
9225e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setPlmn(imsi);
9235e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9245e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Setup expected {@link PasspointConfiguration}
9255e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        PasspointConfiguration passpointConfig = new PasspointConfiguration();
9265e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        HomeSp homeSp = new HomeSp();
9275e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setFqdn(fqdn);
9285e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setFriendlyName(friendlyName);
9295e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
9305e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.setHomeSp(homeSp);
9315e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Credential credential = new Credential();
9325e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
9335e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        simCredential.setEapType(EAPConstants.EAP_SIM);
9345e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        simCredential.setImsi(imsi);
9355e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        credential.setSimCredential(simCredential);
9365e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        credential.setRealm(realm);
9375e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.setCredential(credential);
9385e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9395e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertEquals(passpointConfig, PasspointProvider.convertFromWifiConfig(wifiConfig));
9405e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    }
9415e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9425e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    /**
9435e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * Verify that an expected {@link PasspointConfiguration} will be returned when converting
9445e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * from a {@link WifiConfiguration} containing a certificate credential.
9455e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     *
9465e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     * @throws Exception
9475e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu     */
9485e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    @Test
9495e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    public void convertFromWifiConfigWithCertCredential() throws Exception {
9505e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Test data.
9515e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String fqdn = "test.com";
9525e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String friendlyName = "Friendly Name";
9535e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
9545e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        String realm = "realm.com";
9555e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9565e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Setup WifiConfiguration for legacy Passpoint configuraiton.
9575e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        WifiConfiguration wifiConfig = new WifiConfiguration();
9585e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.FQDN = fqdn;
9595e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.providerFriendlyName = friendlyName;
9605e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.roamingConsortiumIds = rcOIs;
9615e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setRealm(realm);
9625e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        wifiConfig.enterpriseConfig.setEapMethod(WifiEnterpriseConfig.Eap.TLS);
9635e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9645e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        // Setup expected {@link PasspointConfiguration}
9655e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        PasspointConfiguration passpointConfig = new PasspointConfiguration();
9665e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        HomeSp homeSp = new HomeSp();
9675e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setFqdn(fqdn);
9685e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setFriendlyName(friendlyName);
9695e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
9705e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.setHomeSp(homeSp);
9715e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Credential credential = new Credential();
9725e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
9735e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        certCredential.setCertType(Credential.CertificateCredential.CERT_TYPE_X509V3);
9745e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        credential.setCertCredential(certCredential);
9755e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        credential.setRealm(realm);
9765e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        passpointConfig.setCredential(credential);
9775e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
9785e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu        assertEquals(passpointConfig, PasspointProvider.convertFromWifiConfig(wifiConfig));
9795e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu    }
9805e4822d5dba15e45c5ff43dfba3ac7803b3f4e28Peter Qiu
981e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    /**
982e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     * Verify that {@link PasspointProvider#isSimCredential} will return true for provider that's
983e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     * backed by a SIM credential.
984e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     *
985e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     * @throws Exception
986e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     */
987e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    @Test
988e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    public void providerBackedBySimCredential() throws Exception {
989e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        // Test data.
990e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String fqdn = "test.com";
991e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String friendlyName = "Friendly Name";
992e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
993e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String realm = "realm.com";
994e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String imsi = "1234*";
995e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu
996e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        // Create provider with SIM credential.
997e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        PasspointConfiguration config = new PasspointConfiguration();
998e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        HomeSp homeSp = new HomeSp();
999e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        homeSp.setFqdn(fqdn);
1000e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        homeSp.setFriendlyName(friendlyName);
1001e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
1002e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        config.setHomeSp(homeSp);
1003e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        Credential credential = new Credential();
1004e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        credential.setRealm(realm);
1005e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        Credential.SimCredential simCredential = new Credential.SimCredential();
1006e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        simCredential.setImsi(imsi);
1007e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        simCredential.setEapType(EAPConstants.EAP_SIM);
1008e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        credential.setSimCredential(simCredential);
1009e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        config.setCredential(credential);
1010e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        mProvider = createProvider(config);
1011e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu
1012e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        assertTrue(mProvider.isSimCredential());
1013e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    }
1014e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu
1015e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    /**
1016e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     * Verify that {@link PasspointProvider#isSimCredential} will return false for provider that's
1017e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     * not backed by a SIM credential.
1018e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     *
1019e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     * @throws Exception
1020e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu     */
1021e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    @Test
1022e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    public void providerNotBackedBySimCredential() throws Exception {
1023e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        // Test data.
1024e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String fqdn = "test.com";
1025e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String friendlyName = "Friendly Name";
1026e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        long[] rcOIs = new long[] {0x1234L, 0x2345L};
1027e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        String realm = "realm.com";
1028e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu
1029e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        // Create provider with certificate credential.
1030e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        PasspointConfiguration config = new PasspointConfiguration();
1031e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        HomeSp homeSp = new HomeSp();
1032e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        homeSp.setFqdn(fqdn);
1033e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        homeSp.setFriendlyName(friendlyName);
1034e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        homeSp.setRoamingConsortiumOis(rcOIs);
1035e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        config.setHomeSp(homeSp);
1036e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        Credential credential = new Credential();
1037e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        Credential.CertificateCredential certCredential = new Credential.CertificateCredential();
1038e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        certCredential.setCertType(Credential.CertificateCredential.CERT_TYPE_X509V3);
1039e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        credential.setCertCredential(certCredential);
1040e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        credential.setRealm(realm);
1041e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        config.setCredential(credential);
1042e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        mProvider = createProvider(config);
1043e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu
1044e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu        assertFalse(mProvider.isSimCredential());
1045e7dfd69fbe21902b89124b99d914ed3c90ba8bafPeter Qiu    }
104649357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu
104749357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    /**
104849357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * Verify that hasEverConnected flag is set correctly using
104949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * {@link PasspointProvider#setHasEverConnected}.
105049357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     *
105149357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     * @throws Exception
105249357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu     */
105349357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    @Test
105449357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    public void setHasEverConnected() throws Exception {
105549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        PasspointConfiguration config = new PasspointConfiguration();
105649357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        HomeSp homeSp = new HomeSp();
105749357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        homeSp.setFqdn("test1");
105849357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        config.setHomeSp(homeSp);
105949357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        Credential credential = new Credential();
106049357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        credential.setUserCredential(new Credential.UserCredential());
106149357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        config.setCredential(credential);
106249357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        mProvider = createProvider(config);
106349357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        verifyInstalledConfig(config, true);
106449357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu
106549357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        assertFalse(mProvider.getHasEverConnected());
106649357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        mProvider.setHasEverConnected(true);
106749357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu        assertTrue(mProvider.getHasEverConnected());
106849357a30edf5786c8db4bad6f5dbe62545751cc6Peter Qiu    }
1069dc6361c58a4eb2e7dd931ffe1cc0fb5129f004c9Peter Qiu}
1070