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