AnqpCacheTest.java revision 8ca4ac971a9b862fbd69c57af3a3c0029a6b9f4d
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.hotspot2;
18
19import static org.junit.Assert.assertEquals;
20import static org.junit.Assert.assertNotNull;
21import static org.junit.Assert.assertNull;
22import static org.mockito.Mockito.when;
23import static org.mockito.MockitoAnnotations.initMocks;
24
25import android.net.wifi.ScanResult;
26import android.net.wifi.WifiSsid;
27import android.test.suitebuilder.annotation.SmallTest;
28import android.util.Log;
29
30import com.android.server.wifi.Clock;
31import com.android.server.wifi.hotspot2.anqp.ANQPElement;
32import com.android.server.wifi.hotspot2.anqp.Constants;
33import com.android.server.wifi.hotspot2.ANQPData;
34import com.android.server.wifi.hotspot2.AnqpCache;
35import com.android.server.wifi.hotspot2.NetworkDetail;
36import com.android.server.wifi.ScanDetail;
37import com.android.server.wifi.ScanResults;
38
39import org.junit.Test;
40import org.mockito.Mock;
41
42import java.util.ArrayList;
43import java.util.Arrays;
44import java.util.HashMap;
45import java.util.List;
46import java.util.Map;
47
48
49/**
50 * Unit tests for {@link com.android.server.wifi.hotspot2.AnqpCache}.
51 */
52@SmallTest
53public class AnqpCacheTest {
54
55    private static final String TAG = "AnqpCacheTest";
56
57    private static class NetworkDescription {
58        ScanDetail[] mScanDetails;
59        static int[] sChannels = new int[]{2412, 2437, 2462, 5180, 5220, 5745, 5825};
60        static int[] sRSSIs = new int[]{ -50, -80, -60, -80, -55, -90, -75};
61
62        NetworkDescription(String ssid, String bssidPrefix) {
63            WifiSsid wifiSsid = WifiSsid.createFromAsciiEncoded(ssid);
64            mScanDetails = new ScanDetail[sChannels.length];
65            for (int i = 0; i < sChannels.length; i++) {
66                String bssid = String.format("%s:%02x", bssidPrefix, i);
67                ScanResult.InformationElement[] ie = new ScanResult.InformationElement[1];
68                ie[0] = ScanResults.generateSsidIe(ssid);
69                List<String> anqpLines = new ArrayList<String>();
70                NetworkDetail nd = new NetworkDetail(bssid, ie,
71                        new ArrayList<String>(), sChannels[i]);
72                mScanDetails[i] = new ScanDetail(nd, wifiSsid,
73                        bssid, "", sRSSIs[i], sChannels[i], Long.MAX_VALUE, ie, anqpLines);
74            }
75        }
76    }
77
78    private static final String ATT_SSID         = "att_wifi";
79    private static final String ATT_BSSID_PREFIX = "aa:44:bb:55:cc";
80    private static final String TWC_SSID         = "TWCWIFI";
81    private static final String TWC_BSSID_PREFIX = "11:aa:22:bb:33";
82
83    private static ScanDetail[] getAttWifiNetworkDescription() {
84        NetworkDescription network = new NetworkDescription(ATT_SSID, ATT_BSSID_PREFIX);
85        return network.mScanDetails;
86    }
87
88    private static ScanDetail[] getTwcWifiNetworkDescription() {
89        NetworkDescription network = new NetworkDescription(TWC_SSID, TWC_BSSID_PREFIX);
90        return network.mScanDetails;
91    }
92
93    private static List<Constants.ANQPElementType> buildQueryList() {
94        List<Constants.ANQPElementType> list = Arrays.asList(
95                Constants.ANQPElementType.class.getEnumConstants());
96        return list;
97    }
98
99    private static Map<Constants.ANQPElementType, ANQPElement> buildAnqpResult() {
100        Map<Constants.ANQPElementType, ANQPElement> elements = new HashMap<>();
101        List<Constants.ANQPElementType> list = Arrays.asList(
102                Constants.ANQPElementType.class.getEnumConstants());
103        for (final Constants.ANQPElementType type : list) {
104            ANQPElement element = new ANQPElement(type) {
105                @Override
106                public Constants.ANQPElementType getID() {
107                    return super.getID();
108                }
109            };
110            elements.put(type, element);
111        }
112
113        return elements;
114    }
115
116    private void advanceTimeAndTrimCache(long howManyMillis) {
117        mCurrentTimeMillis += howManyMillis;
118        Log.d(TAG, "Time set to " + mCurrentTimeMillis);
119        when(mClock.getWallClockMillis()).thenReturn(mCurrentTimeMillis);
120        mCache.clear(false, true);
121    }
122
123    public AnqpCacheTest() {}
124
125    private static final long SECOND_MS = 1000;
126    private static final long MINUTE_MS = 60 * SECOND_MS;
127
128    @Mock Clock mClock;
129    long mCurrentTimeMillis = 1000000000;
130    AnqpCache mCache;
131
132    /** verify that ANQP data is cached per the (rather abstract) spec */
133    @Test
134    public void basicAddQueryAndExpiry() {
135        initMocks(this);
136
137        AnqpCache cache = mCache = new AnqpCache(mClock);
138        advanceTimeAndTrimCache(0);
139
140        List<Constants.ANQPElementType> queryList = buildQueryList();
141
142        ScanDetail[] attScanDetails = getAttWifiNetworkDescription();
143        ScanDetail[] twcScanDetails = getTwcWifiNetworkDescription();
144
145        /* query att network at time 0 */
146        for (ScanDetail scanDetail : attScanDetails) {
147            cache.initiate(scanDetail.getNetworkDetail(), queryList);
148        }
149
150        /* verify that no data can be returned */
151        for (ScanDetail scanDetail : attScanDetails) {
152            ANQPData data = cache.getEntry(scanDetail.getNetworkDetail());
153            assertNull(data);
154        }
155
156        /* update ANQP results after 1 min */
157        advanceTimeAndTrimCache(1 * MINUTE_MS);
158
159        Map<Constants.ANQPElementType, ANQPElement> anqpResults = buildAnqpResult();
160
161        for (ScanDetail scanDetail : attScanDetails) {
162            cache.update(scanDetail.getNetworkDetail(), anqpResults);
163        }
164
165        /* check ANQP results after another 1 min */
166        advanceTimeAndTrimCache(1 * MINUTE_MS);
167
168        for (ScanDetail scanDetail : attScanDetails) {
169            ANQPData data = cache.getEntry(scanDetail.getNetworkDetail());
170            assertNotNull(data);
171            NetworkDetail nd = data.getNetwork();
172            Map<Constants.ANQPElementType, ANQPElement> anqp = data.getANQPElements();
173            assertEquals(scanDetail.getBSSIDString(), nd.getBSSIDString());
174            assertEquals(anqpResults.size(), anqp.size());
175        }
176
177        /* query ANQP results for twcwifi after another 10 min */
178        advanceTimeAndTrimCache(10 * MINUTE_MS);
179
180        for (ScanDetail scanDetail : twcScanDetails) {
181            cache.initiate(scanDetail.getNetworkDetail(), queryList);
182        }
183
184        /* update ANQP results for twcwifi after another 10 min */
185        advanceTimeAndTrimCache(1 * MINUTE_MS);
186
187        for (ScanDetail scanDetail : twcScanDetails) {
188            cache.update(scanDetail.getNetworkDetail(), anqpResults);
189        }
190
191        /* check all results after 1 minute */
192        advanceTimeAndTrimCache(1 * MINUTE_MS);
193
194        for (ScanDetail scanDetail : attScanDetails) {
195            ANQPData data = cache.getEntry(scanDetail.getNetworkDetail());
196            assertNull(data);
197        }
198
199        for (ScanDetail scanDetail : twcScanDetails) {
200            ANQPData data = cache.getEntry(scanDetail.getNetworkDetail());
201            assertNotNull(data);
202            NetworkDetail nd = data.getNetwork();
203            Map<Constants.ANQPElementType, ANQPElement> anqp = data.getANQPElements();
204            assertEquals(scanDetail.getBSSIDString(), nd.getBSSIDString());
205            assertEquals(anqpResults.size(), anqp.size());
206        }
207    }
208}
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240