WifiBackupRestoreTest.java revision 3204fb9682242a7b5a749489076c66d448c42577
1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.server.wifi;
18
19import static org.junit.Assert.*;
20import static org.mockito.Mockito.*;
21
22import android.net.IpConfiguration;
23import android.net.LinkAddress;
24import android.net.NetworkUtils;
25import android.net.ProxyInfo;
26import android.net.StaticIpConfiguration;
27import android.net.wifi.WifiConfiguration;
28import android.test.suitebuilder.annotation.SmallTest;
29import android.util.Log;
30
31import com.android.server.net.IpConfigStore;
32
33import org.junit.After;
34import org.junit.Before;
35import org.junit.Test;
36
37import java.io.ByteArrayOutputStream;
38import java.io.DataOutputStream;
39import java.io.FileDescriptor;
40import java.io.IOException;
41import java.io.OutputStreamWriter;
42import java.io.PrintWriter;
43import java.io.StringWriter;
44import java.net.InetAddress;
45import java.util.ArrayList;
46import java.util.HashMap;
47import java.util.List;
48import java.util.Map;
49import java.util.Random;
50
51/**
52 * Unit tests for {@link com.android.server.wifi.WifiBackupRestore}.
53 */
54@SmallTest
55public class WifiBackupRestoreTest {
56
57    private static final int TEST_NETWORK_ID = -1;
58    private static final int TEST_UID = 1;
59    private static final String TEST_SSID = "WifiBackupRestoreSSID_";
60    private static final String TEST_PSK = "WifiBackupRestorePsk";
61    private static final String[] TEST_WEP_KEYS =
62            {"WifiBackupRestoreWep1", "WifiBackupRestoreWep2",
63                    "WifiBackupRestoreWep3", "WifiBackupRestoreWep3"};
64    private static final int TEST_WEP_TX_KEY_INDEX = 1;
65    private static final String TEST_FQDN = "WifiBackupRestoreFQDN";
66    private static final String TEST_PROVIDER_FRIENDLY_NAME = "WifiBackupRestoreFriendlyName";
67    private static final String TEST_STATIC_IP_LINK_ADDRESS = "192.168.48.2";
68    private static final int TEST_STATIC_IP_LINK_PREFIX_LENGTH = 8;
69    private static final String TEST_STATIC_IP_GATEWAY_ADDRESS = "192.168.48.1";
70    private static final String[] TEST_STATIC_IP_DNS_SERVER_ADDRESSES =
71            new String[]{"192.168.48.1", "192.168.48.10"};
72    private static final String TEST_STATIC_PROXY_HOST = "192.168.48.1";
73    private static final int TEST_STATIC_PROXY_PORT = 8000;
74    private static final String TEST_STATIC_PROXY_EXCLUSION_LIST = "";
75    private static final String TEST_PAC_PROXY_LOCATION = "http://";
76
77    private final WifiBackupRestore mWifiBackupRestore = new WifiBackupRestore();
78    private boolean mCheckDump = true;
79
80    @Before
81    public void setUp() throws Exception {
82        // Enable verbose logging before tests to check the backup data dumps.
83        mWifiBackupRestore.enableVerboseLogging(1);
84    }
85
86    @After
87    public void cleanUp() throws Exception {
88        if (mCheckDump) {
89            StringWriter stringWriter = new StringWriter();
90            mWifiBackupRestore.dump(
91                    new FileDescriptor(), new PrintWriter(stringWriter), new String[0]);
92            // Ensure that the SSID was dumped out.
93            assertTrue(stringWriter.toString().contains(TEST_SSID));
94            // Ensure that the password wasn't dumped out.
95            assertFalse(stringWriter.toString().contains(TEST_PSK));
96        }
97    }
98
99    /**
100     * Verify that a single open network configuration is serialized & deserialized correctly.
101     */
102    @Test
103    public void testSingleOpenNetworkBackupRestore() {
104        List<WifiConfiguration> configurations = new ArrayList<>();
105        configurations.add(createOpenNetwork(0));
106
107        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
108        List<WifiConfiguration> retrievedConfigurations =
109                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
110        assertConfigurationsEqual(configurations, retrievedConfigurations);
111    }
112
113    /**
114     * Verify that a single open hidden network configuration is serialized & deserialized
115     * correctly.
116     */
117    @Test
118    public void testSingleOpenHiddenNetworkBackupRestore() {
119        List<WifiConfiguration> configurations = new ArrayList<>();
120        configurations.add(createOpenHiddenNetwork(0));
121
122        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
123        List<WifiConfiguration> retrievedConfigurations =
124                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
125        assertConfigurationsEqual(configurations, retrievedConfigurations);
126    }
127
128    /**
129     * Verify that a single PSK network configuration is serialized & deserialized correctly.
130     */
131    @Test
132    public void testSinglePskNetworkBackupRestore() {
133        List<WifiConfiguration> configurations = new ArrayList<>();
134        configurations.add(createPskNetwork(0));
135
136        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
137        List<WifiConfiguration> retrievedConfigurations =
138                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
139        assertConfigurationsEqual(configurations, retrievedConfigurations);
140    }
141
142    /**
143     * Verify that a single PSK hidden network configuration is serialized & deserialized correctly.
144     */
145    @Test
146    public void testSinglePskHiddenNetworkBackupRestore() {
147        List<WifiConfiguration> configurations = new ArrayList<>();
148        configurations.add(createPskHiddenNetwork(0));
149
150        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
151        List<WifiConfiguration> retrievedConfigurations =
152                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
153        assertConfigurationsEqual(configurations, retrievedConfigurations);
154    }
155
156    /**
157     * Verify that a single WEP network configuration is serialized & deserialized correctly.
158     */
159    @Test
160    public void testSingleWepNetworkBackupRestore() {
161        List<WifiConfiguration> configurations = new ArrayList<>();
162        configurations.add(createWepNetwork(0));
163
164        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
165        List<WifiConfiguration> retrievedConfigurations =
166                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
167        assertConfigurationsEqual(configurations, retrievedConfigurations);
168    }
169
170    /**
171     * Verify that a single enterprise network configuration is not serialized.
172     */
173    @Test
174    public void testSingleEnterpriseNetworkNotBackupRestore() {
175        List<WifiConfiguration> configurations = new ArrayList<>();
176        configurations.add(createEapNetwork(0));
177
178        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
179        List<WifiConfiguration> retrievedConfigurations =
180                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
181        assertTrue(retrievedConfigurations.isEmpty());
182        // No valid data to check in dump.
183        mCheckDump = false;
184    }
185
186    /**
187     * Verify that a single PSK network configuration with static ip/proxy settings is serialized &
188     * deserialized correctly.
189     */
190    @Test
191    public void testSinglePskNetworkWithStaticIpAndStaticProxyBackupRestore() {
192        List<WifiConfiguration> configurations = new ArrayList<>();
193        WifiConfiguration pskNetwork = createPskNetwork(0);
194        pskNetwork.setIpConfiguration(createStaticIpConfigurationWithStaticProxy());
195        configurations.add(pskNetwork);
196
197        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
198        List<WifiConfiguration> retrievedConfigurations =
199                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
200        assertConfigurationsEqual(configurations, retrievedConfigurations);
201    }
202
203    /**
204     * Verify that a single PSK network configuration with static ip & PAC proxy settings is
205     * serialized & deserialized correctly.
206     */
207    @Test
208    public void testSinglePskNetworkWithStaticIpAndPACProxyBackupRestore() {
209        List<WifiConfiguration> configurations = new ArrayList<>();
210        WifiConfiguration pskNetwork = createPskNetwork(0);
211        pskNetwork.setIpConfiguration(createStaticIpConfigurationWithPacProxy());
212        configurations.add(pskNetwork);
213
214        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
215        List<WifiConfiguration> retrievedConfigurations =
216                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
217        assertConfigurationsEqual(configurations, retrievedConfigurations);
218    }
219
220    /**
221     * Verify that a single PSK network configuration with DHCP ip & PAC proxy settings is
222     * serialized & deserialized correctly.
223     */
224    @Test
225    public void testSinglePskNetworkWithDHCPIpAndPACProxyBackupRestore() {
226        List<WifiConfiguration> configurations = new ArrayList<>();
227        WifiConfiguration pskNetwork = createPskNetwork(0);
228        pskNetwork.setIpConfiguration(createDHCPIpConfigurationWithPacProxy());
229        configurations.add(pskNetwork);
230
231        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
232        List<WifiConfiguration> retrievedConfigurations =
233                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
234        assertConfigurationsEqual(configurations, retrievedConfigurations);
235    }
236
237    /**
238     * Verify that a single PSK network configuration with partial static ip settings is serialized
239     * & deserialized correctly.
240     */
241    @Test
242    public void testSinglePskNetworkWithPartialStaticIpBackupRestore() {
243        List<WifiConfiguration> configurations = new ArrayList<>();
244        WifiConfiguration pskNetwork = createPskNetwork(0);
245        pskNetwork.setIpConfiguration(createPartialStaticIpConfigurationWithPacProxy());
246        configurations.add(pskNetwork);
247
248        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
249        List<WifiConfiguration> retrievedConfigurations =
250                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
251        assertConfigurationsEqual(configurations, retrievedConfigurations);
252    }
253
254    /**
255     * Verify that multiple networks of different types are serialized and deserialized correctly.
256     */
257    @Test
258    public void testMultipleNetworksAllBackupRestore() {
259        List<WifiConfiguration> configurations = new ArrayList<>();
260        configurations.add(createWepNetwork(0));
261        configurations.add(createWepNetwork(1));
262        configurations.add(createPskNetwork(2));
263        configurations.add(createOpenNetwork(3));
264
265        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
266        List<WifiConfiguration> retrievedConfigurations =
267                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
268        assertConfigurationsEqual(configurations, retrievedConfigurations);
269    }
270
271    /**
272     * Verify that multiple networks of different types except enterprise ones are serialized and
273     * deserialized correctly
274     */
275    @Test
276    public void testMultipleNetworksNonEnterpriseBackupRestore() {
277        List<WifiConfiguration> configurations = new ArrayList<>();
278        List<WifiConfiguration> expectedConfigurations = new ArrayList<>();
279
280        configurations.add(createWepNetwork(0));
281        expectedConfigurations.add(createWepNetwork(0));
282
283        configurations.add(createEapNetwork(1));
284
285        configurations.add(createPskNetwork(2));
286        expectedConfigurations.add(createPskNetwork(2));
287
288        configurations.add(createOpenNetwork(3));
289        expectedConfigurations.add(createOpenNetwork(3));
290
291        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
292        List<WifiConfiguration> retrievedConfigurations =
293                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
294        assertConfigurationsEqual(expectedConfigurations, retrievedConfigurations);
295    }
296
297    /**
298     * Verify that multiple networks with different credential types and IpConfiguration types are
299     * serialized and deserialized correctly.
300     */
301    @Test
302    public void testMultipleNetworksWithDifferentIpConfigurationsAllBackupRestore() {
303        List<WifiConfiguration> configurations = new ArrayList<>();
304
305        WifiConfiguration wepNetwork = createWepNetwork(0);
306        wepNetwork.setIpConfiguration(createDHCPIpConfigurationWithPacProxy());
307        configurations.add(wepNetwork);
308
309        WifiConfiguration pskNetwork = createPskNetwork(1);
310        pskNetwork.setIpConfiguration(createStaticIpConfigurationWithPacProxy());
311        configurations.add(pskNetwork);
312
313        WifiConfiguration openNetwork = createOpenNetwork(2);
314        openNetwork.setIpConfiguration(createStaticIpConfigurationWithStaticProxy());
315        configurations.add(openNetwork);
316
317        byte[] backupData = mWifiBackupRestore.retrieveBackupDataFromConfigurations(configurations);
318        List<WifiConfiguration> retrievedConfigurations =
319                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
320        assertConfigurationsEqual(configurations, retrievedConfigurations);
321    }
322
323    /**
324     * Verify that a single open network configuration is serialized & deserialized correctly from
325     * old backups.
326     */
327    @Test
328    public void testSingleOpenNetworkSupplicantBackupRestore() {
329        List<WifiConfiguration> configurations = new ArrayList<>();
330        configurations.add(createOpenNetwork(0));
331
332        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
333        byte[] ipConfigData = createIpConfBackupData(configurations);
334        List<WifiConfiguration> retrievedConfigurations =
335                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
336                        supplicantData, ipConfigData);
337        assertConfigurationsEqual(configurations, retrievedConfigurations);
338    }
339
340    /**
341     * Verify that a single open hidden network configuration is serialized & deserialized
342     * correctly from old backups.
343     */
344    @Test
345    public void testSingleOpenHiddenNetworkSupplicantBackupRestore() {
346        List<WifiConfiguration> configurations = new ArrayList<>();
347        configurations.add(createOpenHiddenNetwork(0));
348
349        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
350        byte[] ipConfigData = createIpConfBackupData(configurations);
351        List<WifiConfiguration> retrievedConfigurations =
352                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
353                        supplicantData, ipConfigData);
354        assertConfigurationsEqual(configurations, retrievedConfigurations);
355    }
356
357    /**
358     * Verify that a single PSK network configuration is serialized & deserialized correctly from
359     * old backups.
360     */
361    @Test
362    public void testSinglePskNetworkSupplicantBackupRestore() {
363        List<WifiConfiguration> configurations = new ArrayList<>();
364        configurations.add(createPskNetwork(0));
365
366        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
367        byte[] ipConfigData = createIpConfBackupData(configurations);
368        List<WifiConfiguration> retrievedConfigurations =
369                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
370                        supplicantData, ipConfigData);
371        assertConfigurationsEqual(configurations, retrievedConfigurations);
372    }
373
374    /**
375     * Verify that a single PSK hidden network configuration is serialized & deserialized correctly
376     * from old backups.
377     */
378    @Test
379    public void testSinglePskHiddenNetworkSupplicantBackupRestore() {
380        List<WifiConfiguration> configurations = new ArrayList<>();
381        configurations.add(createPskHiddenNetwork(0));
382
383        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
384        byte[] ipConfigData = createIpConfBackupData(configurations);
385        List<WifiConfiguration> retrievedConfigurations =
386                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
387                        supplicantData, ipConfigData);
388        assertConfigurationsEqual(configurations, retrievedConfigurations);
389    }
390
391    /**
392     * Verify that a single WEP network configuration is serialized & deserialized correctly from
393     * old backups.
394     */
395    @Test
396    public void testSingleWepNetworkSupplicantBackupRestore() {
397        List<WifiConfiguration> configurations = new ArrayList<>();
398        configurations.add(createWepNetwork(0));
399
400        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
401        byte[] ipConfigData = createIpConfBackupData(configurations);
402        List<WifiConfiguration> retrievedConfigurations =
403                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
404                        supplicantData, ipConfigData);
405        assertConfigurationsEqual(configurations, retrievedConfigurations);
406    }
407
408    /**
409     * Verify that a single enterprise network configuration is not serialized from old backups.
410     */
411    @Test
412    public void testSingleEnterpriseNetworkNotSupplicantBackupRestore() {
413        List<WifiConfiguration> configurations = new ArrayList<>();
414        configurations.add(createEapNetwork(0));
415
416        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
417        byte[] ipConfigData = createIpConfBackupData(configurations);
418        List<WifiConfiguration> retrievedConfigurations =
419                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
420                        supplicantData, ipConfigData);
421        assertTrue(retrievedConfigurations.isEmpty());
422    }
423
424    /**
425     * Verify that multiple networks with different credential types and IpConfiguration types are
426     * serialized and deserialized correctly from old backups
427     */
428    @Test
429    public void testMultipleNetworksWithDifferentIpConfigurationsAllSupplicantBackupRestore() {
430        List<WifiConfiguration> configurations = new ArrayList<>();
431
432        WifiConfiguration wepNetwork = createWepNetwork(0);
433        wepNetwork.setIpConfiguration(createDHCPIpConfigurationWithPacProxy());
434        configurations.add(wepNetwork);
435
436        WifiConfiguration pskNetwork = createPskNetwork(1);
437        pskNetwork.setIpConfiguration(createStaticIpConfigurationWithPacProxy());
438        configurations.add(pskNetwork);
439
440        WifiConfiguration openNetwork = createOpenNetwork(2);
441        openNetwork.setIpConfiguration(createStaticIpConfigurationWithStaticProxy());
442        configurations.add(openNetwork);
443
444        byte[] supplicantData = createWpaSupplicantConfBackupData(configurations);
445        byte[] ipConfigData = createIpConfBackupData(configurations);
446        List<WifiConfiguration> retrievedConfigurations =
447                mWifiBackupRestore.retrieveConfigurationsFromSupplicantBackupData(
448                        supplicantData, ipConfigData);
449        assertConfigurationsEqual(configurations, retrievedConfigurations);
450    }
451
452    /**
453     * Verify that any corrupted data provided by Backup/Restore is ignored correctly.
454     */
455    @Test
456    public void testCorruptBackupRestore() {
457        Random random = new Random();
458        byte[] backupData = new byte[100];
459        random.nextBytes(backupData);
460
461        List<WifiConfiguration> retrievedConfigurations =
462                mWifiBackupRestore.retrieveConfigurationsFromBackupData(backupData);
463        assertNull(retrievedConfigurations);
464        // No valid data to check in dump.
465        mCheckDump = false;
466    }
467
468    private WifiConfiguration createOpenNetwork(int id) {
469        String ssid = "\"" + TEST_SSID + id + "\"";
470        return WifiConfigurationTestUtil.generateWifiConfig(TEST_NETWORK_ID, TEST_UID, ssid,
471                true, true, null, null,
472                WifiConfigurationTestUtil.SECURITY_NONE);
473    }
474
475    private WifiConfiguration createOpenHiddenNetwork(int id) {
476        String ssid = "\"" + TEST_SSID + id + "\"";
477        WifiConfiguration config =
478                WifiConfigurationTestUtil.generateWifiConfig(TEST_NETWORK_ID, TEST_UID, ssid,
479                true, true, null, null,
480                WifiConfigurationTestUtil.SECURITY_NONE);
481        config.hiddenSSID = true;
482        return config;
483    }
484
485    private WifiConfiguration createPskNetwork(int id) {
486        String ssid = "\"" + TEST_SSID + id + "\"";
487        WifiConfiguration configuration =
488                WifiConfigurationTestUtil.generateWifiConfig(TEST_NETWORK_ID, TEST_UID, ssid,
489                        true, true, null, null,
490                        WifiConfigurationTestUtil.SECURITY_PSK);
491        configuration.preSharedKey = TEST_PSK;
492        return configuration;
493    }
494
495    private WifiConfiguration createPskHiddenNetwork(int id) {
496        String ssid = "\"" + TEST_SSID + id + "\"";
497        WifiConfiguration configuration =
498                WifiConfigurationTestUtil.generateWifiConfig(TEST_NETWORK_ID, TEST_UID, ssid,
499                        true, true, null, null,
500                        WifiConfigurationTestUtil.SECURITY_PSK);
501        configuration.preSharedKey = TEST_PSK;
502        configuration.hiddenSSID = true;
503        return configuration;
504    }
505
506    private WifiConfiguration createWepNetwork(int id) {
507        String ssid = "\"" + TEST_SSID + id + "\"";
508        WifiConfiguration configuration =
509                WifiConfigurationTestUtil.generateWifiConfig(TEST_NETWORK_ID, TEST_UID, ssid,
510                        true, true, null, null,
511                        WifiConfigurationTestUtil.SECURITY_WEP);
512        configuration.wepKeys = TEST_WEP_KEYS;
513        configuration.wepTxKeyIndex = TEST_WEP_TX_KEY_INDEX;
514        return configuration;
515    }
516
517    private WifiConfiguration createEapNetwork(int id) {
518        String ssid = "\"" + TEST_SSID + id + "\"";
519        WifiConfiguration configuration =
520                WifiConfigurationTestUtil.generateWifiConfig(TEST_NETWORK_ID, TEST_UID, ssid,
521                        true, true, TEST_FQDN, TEST_PROVIDER_FRIENDLY_NAME,
522                        WifiConfigurationTestUtil.SECURITY_EAP);
523        return configuration;
524    }
525
526    private StaticIpConfiguration createStaticIpConfiguration() {
527        StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();
528        LinkAddress linkAddress =
529                new LinkAddress(NetworkUtils.numericToInetAddress(TEST_STATIC_IP_LINK_ADDRESS),
530                        TEST_STATIC_IP_LINK_PREFIX_LENGTH);
531        staticIpConfiguration.ipAddress = linkAddress;
532        InetAddress gatewayAddress =
533                NetworkUtils.numericToInetAddress(TEST_STATIC_IP_GATEWAY_ADDRESS);
534        staticIpConfiguration.gateway = gatewayAddress;
535        for (String dnsServerAddress : TEST_STATIC_IP_DNS_SERVER_ADDRESSES) {
536            staticIpConfiguration.dnsServers.add(
537                    NetworkUtils.numericToInetAddress(dnsServerAddress));
538        }
539        return staticIpConfiguration;
540    }
541
542    private StaticIpConfiguration createPartialStaticIpConfiguration() {
543        StaticIpConfiguration staticIpConfiguration = new StaticIpConfiguration();
544        LinkAddress linkAddress =
545                new LinkAddress(NetworkUtils.numericToInetAddress(TEST_STATIC_IP_LINK_ADDRESS),
546                        TEST_STATIC_IP_LINK_PREFIX_LENGTH);
547        staticIpConfiguration.ipAddress = linkAddress;
548        // Only set the link address, don't set the gateway/dns servers.
549        return staticIpConfiguration;
550    }
551
552    private IpConfiguration createStaticIpConfigurationWithPacProxy() {
553        StaticIpConfiguration staticIpConfiguration = createStaticIpConfiguration();
554        ProxyInfo proxyInfo = new ProxyInfo(TEST_PAC_PROXY_LOCATION);
555        return new IpConfiguration(IpConfiguration.IpAssignment.STATIC,
556                IpConfiguration.ProxySettings.PAC, staticIpConfiguration, proxyInfo);
557    }
558
559    private IpConfiguration createStaticIpConfigurationWithStaticProxy() {
560        StaticIpConfiguration staticIpConfiguration = createStaticIpConfiguration();
561        ProxyInfo proxyInfo =
562                new ProxyInfo(TEST_STATIC_PROXY_HOST,
563                        TEST_STATIC_PROXY_PORT,
564                        TEST_STATIC_PROXY_EXCLUSION_LIST);
565        return new IpConfiguration(IpConfiguration.IpAssignment.STATIC,
566                IpConfiguration.ProxySettings.STATIC, staticIpConfiguration, proxyInfo);
567    }
568
569    private IpConfiguration createPartialStaticIpConfigurationWithPacProxy() {
570        StaticIpConfiguration staticIpConfiguration = createPartialStaticIpConfiguration();
571        ProxyInfo proxyInfo = new ProxyInfo(TEST_PAC_PROXY_LOCATION);
572        return new IpConfiguration(IpConfiguration.IpAssignment.STATIC,
573                IpConfiguration.ProxySettings.PAC, staticIpConfiguration, proxyInfo);
574    }
575
576    private IpConfiguration createDHCPIpConfigurationWithPacProxy() {
577        ProxyInfo proxyInfo = new ProxyInfo(TEST_PAC_PROXY_LOCATION);
578        return new IpConfiguration(IpConfiguration.IpAssignment.DHCP,
579                IpConfiguration.ProxySettings.PAC, null, proxyInfo);
580    }
581
582    /**
583     * Helper method to write a list of networks in wpa_supplicant.conf format to the output stream.
584     */
585    private byte[] createWpaSupplicantConfBackupData(List<WifiConfiguration> configurations) {
586        ByteArrayOutputStream bos = new ByteArrayOutputStream();
587        OutputStreamWriter out = new OutputStreamWriter(bos);
588        try {
589            for (WifiConfiguration configuration : configurations) {
590                writeConfigurationToWpaSupplicantConf(out, configuration);
591            }
592            out.flush();
593            return bos.toByteArray();
594        } catch (IOException e) {
595            return null;
596        }
597    }
598
599    /**
600     * Helper method to write a network in wpa_supplicant.conf format to the output stream.
601     * This was created using a sample wpa_supplicant.conf file. Using the raw key strings here
602     * (instead of consts in WifiBackupRestore).
603     */
604    private void writeConfigurationToWpaSupplicantConf(
605            OutputStreamWriter out, WifiConfiguration configuration)
606            throws IOException {
607        out.write("network={\n");
608        out.write("        " + "ssid=" + configuration.SSID + "\n");
609        String allowedKeyManagement = "";
610        if (configuration.hiddenSSID) {
611            out.write("        " + "scan_ssid=1" + "\n");
612        }
613        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE)) {
614            allowedKeyManagement += "NONE";
615        }
616        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK)) {
617            allowedKeyManagement += "WPA-PSK ";
618        }
619        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP)) {
620            allowedKeyManagement += "WPA-EAP ";
621        }
622        if (configuration.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X)) {
623            allowedKeyManagement += "IEEE8021X ";
624        }
625        out.write("        " + "key_mgmt=" + allowedKeyManagement + "\n");
626        if (configuration.preSharedKey != null) {
627            out.write("        " + "psk=" + configuration.preSharedKey + "\n");
628        }
629        if (configuration.wepKeys[0] != null) {
630            out.write("        " + "wep_key0=" + configuration.wepKeys[0] + "\n");
631        }
632        if (configuration.wepKeys[1] != null) {
633            out.write("        " + "wep_key1=" + configuration.wepKeys[1] + "\n");
634        }
635        if (configuration.wepKeys[2] != null) {
636            out.write("        " + "wep_key2=" + configuration.wepKeys[2] + "\n");
637        }
638        if (configuration.wepKeys[3] != null) {
639            out.write("        " + "wep_key3=" + configuration.wepKeys[3] + "\n");
640        }
641        if (configuration.wepKeys[0] != null || configuration.wepKeys[1] != null
642                || configuration.wepKeys[2] != null || configuration.wepKeys[3] != null) {
643            out.write("        " + "wep_tx_keyidx=" + configuration.wepTxKeyIndex + "\n");
644        }
645        Map<String, String> extras = new HashMap<>();
646        extras.put(WifiConfigStore.ID_STRING_KEY_CONFIG_KEY, configuration.configKey());
647        extras.put(WifiConfigStore.ID_STRING_KEY_CREATOR_UID,
648                Integer.toString(configuration.creatorUid));
649        String idString = WifiNative.createNetworkExtra(extras);
650        if (idString != null) {
651            idString = "\"" + idString + "\"";
652            out.write("        " + "id_str=" + idString + "\n");
653        }
654        out.write("}\n");
655        out.write("\n");
656    }
657
658    /**
659     * Helper method to write a list of networks in ipconfig.txt format to the output stream.
660     */
661    private byte[] createIpConfBackupData(List<WifiConfiguration> configurations) {
662        ByteArrayOutputStream bos = new ByteArrayOutputStream();
663        DataOutputStream out = new DataOutputStream(bos);
664        try {
665            // write version first.
666            out.writeInt(2);
667            for (WifiConfiguration configuration : configurations) {
668                IpConfigStore.writeConfig(out, configuration.configKey().hashCode(),
669                        configuration.getIpConfiguration());
670            }
671            out.flush();
672            return bos.toByteArray();
673        } catch (IOException e) {
674            return null;
675        }
676    }
677
678    /**
679     * Asserts that the 2 lists of configurations are equal
680     */
681    private void assertConfigurationsEqual(
682            List<WifiConfiguration> expected, List<WifiConfiguration> actual) {
683        assertEquals(expected.size(), actual.size());
684        for (WifiConfiguration expectedConfiguration : expected) {
685            String expectedConfigKey = expectedConfiguration.configKey();
686            boolean didCompare = false;
687            for (WifiConfiguration actualConfiguration : actual) {
688                String actualConfigKey = actualConfiguration.configKey();
689                if (actualConfigKey.equals(expectedConfigKey)) {
690                    assertConfigurationEqual(expectedConfiguration, actualConfiguration);
691                    didCompare = true;
692                }
693            }
694            assertTrue(didCompare);
695        }
696    }
697
698    /**
699     * Asserts that the 2 WifiConfigurations are equal
700     */
701    private void assertConfigurationEqual(
702            WifiConfiguration expected, WifiConfiguration actual) {
703        assertEquals(expected.SSID, actual.SSID);
704        assertEquals(expected.BSSID, actual.BSSID);
705        assertEquals(expected.preSharedKey, actual.preSharedKey);
706        assertEquals(expected.wepKeys, actual.wepKeys);
707        assertEquals(expected.wepTxKeyIndex, actual.wepTxKeyIndex);
708        assertEquals(expected.hiddenSSID, actual.hiddenSSID);
709        assertEquals(expected.allowedKeyManagement, actual.allowedKeyManagement);
710        assertEquals(expected.allowedProtocols, actual.allowedProtocols);
711        assertEquals(expected.allowedAuthAlgorithms, actual.allowedAuthAlgorithms);
712        assertEquals(expected.shared, actual.shared);
713        assertEquals(expected.creatorUid, actual.creatorUid);
714        assertEquals(expected.getIpConfiguration(), actual.getIpConfiguration());
715    }
716}
717