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