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.util;
18
19import static org.junit.Assert.*;
20
21import android.net.wifi.ScanResult;
22import android.net.wifi.ScanResult.InformationElement;
23import android.net.wifi.WifiConfiguration;
24import android.net.wifi.WifiSsid;
25import android.test.suitebuilder.annotation.SmallTest;
26
27import com.android.server.wifi.ScanDetail;
28
29import org.junit.Test;
30
31import java.nio.charset.StandardCharsets;
32import java.util.Arrays;
33
34/**
35 * Unit tests for {@link com.android.server.wifi.util.ScanResultUtil}.
36 */
37@SmallTest
38public class ScanResultUtilTest {
39
40    @Test
41    public void convertScanResult() {
42        final String ssid = "SOME SsId";
43
44        ScanResult input = new ScanResult(WifiSsid.createFromAsciiEncoded(ssid), ssid,
45                "ab:cd:01:ef:45:89", 1245, 0, "", -78, 2450, 1025, 22, 33, 20, 0, 0, true);
46
47        input.informationElements = new InformationElement[] {
48            createIE(InformationElement.EID_SSID, ssid.getBytes(StandardCharsets.UTF_8))
49        };
50
51        ScanDetail output = ScanResultUtil.toScanDetail(input);
52
53        validateScanDetail(input, output);
54    }
55
56    @Test
57    public void convertScanResultWithAnqpLines() {
58        final String ssid = "SOME SsId";
59
60        ScanResult input = new ScanResult(WifiSsid.createFromAsciiEncoded(ssid), ssid,
61                "ab:cd:01:ef:45:89", 1245, 0, "some caps", -78, 2450, 1025, 22, 33, 20, 0, 0, true);
62
63        input.informationElements = new InformationElement[] {
64            createIE(InformationElement.EID_SSID, ssid.getBytes(StandardCharsets.UTF_8))
65        };
66        input.anqpLines = Arrays.asList("LINE 1", "line 2", "Line 3");
67
68        ScanDetail output = ScanResultUtil.toScanDetail(input);
69
70        validateScanDetail(input, output);
71    }
72
73    @Test
74    public void convertScanResultWithoutWifiSsid() {
75        final String ssid = "Another SSid";
76        ScanResult input = new ScanResult(ssid, "ab:cd:01:ef:45:89", 1245, 0, "other caps",
77                -78, 2450, 1025, 22, 33, 20, 0, 0, true);
78        input.informationElements = new InformationElement[] {
79            createIE(InformationElement.EID_SSID, ssid.getBytes(StandardCharsets.UTF_8))
80        };
81
82        ScanDetail output = ScanResultUtil.toScanDetail(input);
83
84        validateScanDetail(input, output);
85    }
86
87    @Test
88    public void testNetworkCreationFromScanResult() {
89        final String ssid = "Another SSid";
90        ScanResult scanResult = new ScanResult(ssid, "ab:cd:01:ef:45:89", 1245, 0, "",
91                -78, 2450, 1025, 22, 33, 20, 0, 0, true);
92        WifiConfiguration config;
93
94        scanResult.capabilities = "";
95        config = ScanResultUtil.createNetworkFromScanResult(scanResult);
96        assertEquals(config.SSID, ScanResultUtil.createQuotedSSID(ssid));
97        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE));
98
99        scanResult.capabilities = "WEP";
100        config = ScanResultUtil.createNetworkFromScanResult(scanResult);
101        assertEquals(config.SSID, ScanResultUtil.createQuotedSSID(ssid));
102        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.NONE));
103        assertTrue(config.allowedAuthAlgorithms.get(WifiConfiguration.AuthAlgorithm.OPEN));
104        assertTrue(config.allowedAuthAlgorithms.get(WifiConfiguration.AuthAlgorithm.SHARED));
105
106        scanResult.capabilities = "PSK";
107        config = ScanResultUtil.createNetworkFromScanResult(scanResult);
108        assertEquals(config.SSID, ScanResultUtil.createQuotedSSID(ssid));
109        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_PSK));
110
111        scanResult.capabilities = "EAP";
112        config = ScanResultUtil.createNetworkFromScanResult(scanResult);
113        assertEquals(config.SSID, ScanResultUtil.createQuotedSSID(ssid));
114        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.WPA_EAP));
115        assertTrue(config.allowedKeyManagement.get(WifiConfiguration.KeyMgmt.IEEE8021X));
116    }
117
118    private static InformationElement createIE(int id, byte[] bytes) {
119        InformationElement ie = new InformationElement();
120        ie.id = id;
121        ie.bytes = bytes;
122        return ie;
123    }
124
125    private static void validateScanDetail(ScanResult input, ScanDetail output) {
126        assertNotNull("NetworkDetail was null", output.getNetworkDetail());
127        assertNotNull("ScanResult was null", output.getScanResult());
128        assertEquals("NetworkDetail SSID", input.SSID,
129                output.getNetworkDetail().getSSID());
130        assertEquals("ScanResult SSID", input.SSID,
131                output.getScanResult().SSID);
132        assertEquals("ScanResult wifiSsid", input.wifiSsid,
133                output.getScanResult().wifiSsid);
134        assertEquals("getSSID", input.SSID, output.getSSID());
135        assertEquals("NetworkDetail BSSID", input.BSSID,
136                output.getNetworkDetail().getBSSIDString());
137        assertEquals("getBSSIDString", input.BSSID, output.getBSSIDString());
138        assertEquals("ScanResult frequency", input.frequency,
139                output.getScanResult().frequency);
140        assertEquals("ScanResult level", input.level,
141                output.getScanResult().level);
142        assertEquals("ScanResult capabilities", input.capabilities,
143                output.getScanResult().capabilities);
144        assertEquals("ScanResult timestamp", input.timestamp,
145                output.getScanResult().timestamp);
146        assertArrayEquals("ScanResult information elements", input.informationElements,
147                output.getScanResult().informationElements);
148        assertEquals("ScanResult anqp lines", input.anqpLines,
149                output.getScanResult().anqpLines);
150    }
151
152}
153