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