1 /* 2 * Copyright (C) 2018 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 package com.android.ons; 17 18 import static org.junit.Assert.*; 19 import static org.junit.Assert.assertFalse; 20 import static org.mockito.Mockito.*; 21 22 import android.os.Looper; 23 import android.telephony.AccessNetworkConstants; 24 import android.telephony.AvailableNetworkInfo; 25 import android.telephony.CellIdentityLte; 26 import android.telephony.CellIdentityNr; 27 import android.telephony.CellInfo; 28 import android.telephony.CellInfoLte; 29 import android.telephony.CellInfoNr; 30 import android.telephony.NetworkScan; 31 import android.telephony.NetworkScanRequest; 32 import android.telephony.RadioAccessSpecifier; 33 import android.telephony.SubscriptionInfo; 34 35 import org.junit.After; 36 import org.junit.Before; 37 import org.junit.Test; 38 39 import java.util.ArrayList; 40 import java.util.Arrays; 41 import java.util.Collections; 42 import java.util.List; 43 44 public class ONSNetworkScanCtlrTest extends ONSBaseTest { 45 private ONSNetworkScanCtlr mONSNetworkScanCtlr; 46 private NetworkScan mNetworkScan; 47 private List<CellInfo> mResults; 48 private int mError; 49 private boolean mCallbackInvoked; 50 private Looper mLooper; 51 52 private static final int SEARCH_PERIODICITY = 60; 53 private static final SubscriptionInfo TEST_SUBSCRIPTION_INFO = new SubscriptionInfo( 54 1, "", 1, null, null, 0, 0, null, 0, null, "310", "210", null, 55 false, null, null); 56 private static final RadioAccessSpecifier TEST_5G_RAS = new RadioAccessSpecifier( 57 AccessNetworkConstants.AccessNetworkType.NGRAN, 58 new int[] {AccessNetworkConstants.NgranBands.BAND_71}, 59 null); 60 private static final RadioAccessSpecifier TEST_4G_RAS = new RadioAccessSpecifier( 61 AccessNetworkConstants.AccessNetworkType.EUTRAN, 62 new int[] {AccessNetworkConstants.EutranBand.BAND_48}, 63 null); 64 65 @Before setUp()66 public void setUp() throws Exception { 67 super.setUp("ONSTest"); 68 mLooper = null; 69 mNetworkScan = new NetworkScan(1, 1); 70 doReturn(mNetworkScan).when(mMockTelephonyManager).requestNetworkScan(any(), any()); 71 } 72 73 @After tearDown()74 public void tearDown() throws Exception { 75 if (mLooper != null) { 76 mLooper.quit(); 77 mLooper.getThread().join(); 78 } 79 super.tearDown(); 80 } 81 82 @Test testStartFastNetworkScan()83 public void testStartFastNetworkScan() { 84 ArrayList<String> mccMncs = new ArrayList<>(); 85 mccMncs.add("310210"); 86 AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs, 87 new ArrayList<Integer>()); 88 List<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>(); 89 availableNetworkInfos.add(availableNetworkInfo); 90 List<CellInfo> expectedResults = new ArrayList<CellInfo>(); 91 CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1); 92 CellInfoLte cellInfoLte = new CellInfoLte(); 93 cellInfoLte.setCellIdentity(cellIdentityLte); 94 expectedResults.add((CellInfo)cellInfoLte); 95 96 initONSNetworkScanCtrl(); 97 98 // Testing startFastNetworkScan, onNetworkAvailability should be called with expectedResults 99 mONSNetworkScanCtlr.startFastNetworkScan(availableNetworkInfos); 100 mONSNetworkScanCtlr.mNetworkScanCallback.onResults(expectedResults); 101 waitUntilReady(100); 102 assertEquals(expectedResults, mResults); 103 } 104 105 @Test testStartFastNetworkScanFail()106 public void testStartFastNetworkScanFail() { 107 List<CellInfo> expectedResults = new ArrayList<CellInfo>(); 108 CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1); 109 CellInfoLte cellInfoLte = new CellInfoLte(); 110 cellInfoLte.setCellIdentity(cellIdentityLte); 111 expectedResults.add((CellInfo)cellInfoLte); 112 ArrayList<String> mccMncs = new ArrayList<>(); 113 mccMncs.add("310210"); 114 AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs, 115 new ArrayList<Integer>()); 116 List<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>(); 117 availableNetworkInfos.add(availableNetworkInfo); 118 mError = NetworkScan.SUCCESS; 119 120 initONSNetworkScanCtrl(); 121 122 // Testing startFastNetworkScan, onError should be called with ERROR_INVALID_SCAN 123 mONSNetworkScanCtlr.startFastNetworkScan(availableNetworkInfos); 124 mONSNetworkScanCtlr.mNetworkScanCallback.onError(NetworkScan.ERROR_INVALID_SCAN); 125 waitUntilReady(100); 126 assertEquals(NetworkScan.ERROR_INVALID_SCAN, mError); 127 } 128 129 @Test testStartFastNetworkScanWithMultipleNetworks()130 public void testStartFastNetworkScanWithMultipleNetworks() { 131 List<CellInfo> expectedResults = new ArrayList<CellInfo>(); 132 CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1); 133 CellInfoLte cellInfoLte = new CellInfoLte(); 134 cellInfoLte.setCellIdentity(cellIdentityLte); 135 expectedResults.add((CellInfo)cellInfoLte); 136 ArrayList<String> mccMncs = new ArrayList<>(); 137 mccMncs.add("310210"); 138 mccMncs.add("310211"); 139 AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs, 140 new ArrayList<Integer>()); 141 List<AvailableNetworkInfo> availableNetworkInfos = new ArrayList<AvailableNetworkInfo>(); 142 availableNetworkInfos.add(availableNetworkInfo); 143 144 initONSNetworkScanCtrl(); 145 146 // Testing startSlowNetworkScan, onNetworkAvailability should be called with expectedResults 147 mONSNetworkScanCtlr.startFastNetworkScan(availableNetworkInfos); 148 mONSNetworkScanCtlr.mNetworkScanCallback.onResults(expectedResults); 149 waitUntilReady(100); 150 assertEquals(expectedResults, mResults); 151 } 152 153 @Test testStopNetworkScan()154 public void testStopNetworkScan() { 155 List<CellInfo> expectedResults = new ArrayList<CellInfo>(); 156 CellIdentityLte cellIdentityLte = new CellIdentityLte(310, 210, 1, 1, 1); 157 CellInfoLte cellInfoLte = new CellInfoLte(); 158 cellInfoLte.setCellIdentity(cellIdentityLte); 159 expectedResults.add((CellInfo)cellInfoLte); 160 ArrayList<String> mccMncs = new ArrayList<>(); 161 mccMncs.add("310210"); 162 AvailableNetworkInfo availableNetworkInfo = new AvailableNetworkInfo(1, 1, mccMncs, 163 new ArrayList<Integer>()); 164 List<AvailableNetworkInfo> availableNetworkInfos = 165 new ArrayList<AvailableNetworkInfo>(); 166 availableNetworkInfos.add(availableNetworkInfo); 167 mCallbackInvoked = false; 168 169 initONSNetworkScanCtrl(); 170 171 // Testing stopNetworkScan, should not get any callback invocation after stopNetworkScan. 172 mONSNetworkScanCtlr.startFastNetworkScan(availableNetworkInfos); 173 mONSNetworkScanCtlr.stopNetworkScan(); 174 mONSNetworkScanCtlr.mNetworkScanCallback.onResults(expectedResults); 175 waitUntilReady(100); 176 assertFalse(mCallbackInvoked); 177 } 178 179 @Test testCreateNetworkScanRequest_withNoSpecifiedRasOrBands_4gScanEnabled()180 public void testCreateNetworkScanRequest_withNoSpecifiedRasOrBands_4gScanEnabled() { 181 initONSNetworkScanCtrl(); 182 mONSNetworkScanCtlr.setIs4gScanEnabled(true); 183 184 NetworkScanRequest networkScanRequest = createNetworkScanRequest(new ArrayList<>()); 185 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 186 187 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 188 assertEquals(networkScanRequest.getPlmns().size(), 1); 189 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 190 assertEquals(radioAccessSpecifiers.length, 2); 191 assertEquals(radioAccessSpecifiers[0], ONSNetworkScanCtlr.DEFAULT_5G_RAS); 192 assertEquals(radioAccessSpecifiers[1], ONSNetworkScanCtlr.DEFAULT_4G_RAS); 193 } 194 195 @Test testCreateNetworkScanRequest_withNoSpecifiedRasOrBands_4gScanDisabled()196 public void testCreateNetworkScanRequest_withNoSpecifiedRasOrBands_4gScanDisabled() { 197 initONSNetworkScanCtrl(); 198 mONSNetworkScanCtlr.setIs4gScanEnabled(false); 199 200 NetworkScanRequest networkScanRequest = createNetworkScanRequest(new ArrayList<>()); 201 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 202 203 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 204 assertEquals(networkScanRequest.getPlmns().size(), 1); 205 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 206 assertEquals(radioAccessSpecifiers.length, 1); 207 assertEquals(radioAccessSpecifiers[0], ONSNetworkScanCtlr.DEFAULT_5G_RAS); 208 } 209 210 @Test testCreateNetworkScanRequest_withSpecified5gRAS_4gScanEnabled()211 public void testCreateNetworkScanRequest_withSpecified5gRAS_4gScanEnabled() { 212 initONSNetworkScanCtrl(); 213 mONSNetworkScanCtlr.setIs4gScanEnabled(true); 214 215 NetworkScanRequest networkScanRequest = createNetworkScanRequest( 216 new ArrayList<>(Arrays.asList(TEST_5G_RAS))); 217 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 218 219 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 220 assertEquals(networkScanRequest.getPlmns().size(), 1); 221 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 222 assertEquals(radioAccessSpecifiers.length, 1); 223 assertEquals(radioAccessSpecifiers[0], TEST_5G_RAS); 224 } 225 226 @Test testCreateNetworkScanRequest_withSpecified4gRAS_4gScanEnabled()227 public void testCreateNetworkScanRequest_withSpecified4gRAS_4gScanEnabled() { 228 initONSNetworkScanCtrl(); 229 mONSNetworkScanCtlr.setIs4gScanEnabled(true); 230 231 NetworkScanRequest networkScanRequest = createNetworkScanRequest( 232 new ArrayList<>(Arrays.asList(TEST_4G_RAS))); 233 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 234 235 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 236 assertEquals(networkScanRequest.getPlmns().size(), 1); 237 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 238 assertEquals(radioAccessSpecifiers.length, 1); 239 assertEquals(radioAccessSpecifiers[0], TEST_4G_RAS); 240 } 241 242 @Test testCreateNetworkScanRequest_withSpecified4gRAS_4gScanDisabled()243 public void testCreateNetworkScanRequest_withSpecified4gRAS_4gScanDisabled() { 244 initONSNetworkScanCtrl(); 245 mONSNetworkScanCtlr.setIs4gScanEnabled(false); 246 247 NetworkScanRequest networkScanRequest = createNetworkScanRequest( 248 new ArrayList<>(Arrays.asList(TEST_4G_RAS))); 249 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 250 251 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 252 assertEquals(networkScanRequest.getPlmns().size(), 1); 253 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 254 assertEquals(radioAccessSpecifiers.length, 1); 255 assertEquals(radioAccessSpecifiers[0], ONSNetworkScanCtlr.DEFAULT_5G_RAS); 256 } 257 258 @Test testCreateNetworkScanRequest_withSpecified4gAnd5gRAS_4gScanEnabled()259 public void testCreateNetworkScanRequest_withSpecified4gAnd5gRAS_4gScanEnabled() { 260 initONSNetworkScanCtrl(); 261 mONSNetworkScanCtlr.setIs4gScanEnabled(true); 262 263 NetworkScanRequest networkScanRequest = createNetworkScanRequest( 264 new ArrayList<>(Arrays.asList(TEST_5G_RAS, TEST_4G_RAS))); 265 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 266 267 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 268 assertEquals(networkScanRequest.getPlmns().size(), 1); 269 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 270 assertEquals(radioAccessSpecifiers.length, 2); 271 assertEquals(radioAccessSpecifiers[0], TEST_4G_RAS); 272 assertEquals(radioAccessSpecifiers[1], TEST_5G_RAS); 273 } 274 275 @Test testCreateNetworkScanRequest_withSpecified4gAnd5gRAS_4gScanDisabled()276 public void testCreateNetworkScanRequest_withSpecified4gAnd5gRAS_4gScanDisabled() { 277 initONSNetworkScanCtrl(); 278 mONSNetworkScanCtlr.setIs4gScanEnabled(false); 279 280 NetworkScanRequest networkScanRequest = createNetworkScanRequest( 281 new ArrayList<>(Arrays.asList(TEST_5G_RAS, TEST_4G_RAS))); 282 RadioAccessSpecifier[] radioAccessSpecifiers = networkScanRequest.getSpecifiers(); 283 284 assertEquals(networkScanRequest.getSearchPeriodicity(), SEARCH_PERIODICITY); 285 assertEquals(networkScanRequest.getPlmns().size(), 1); 286 assertEquals(networkScanRequest.getPlmns().get(0), "310210"); 287 assertEquals(radioAccessSpecifiers.length, 1); 288 assertEquals(radioAccessSpecifiers[0], TEST_5G_RAS); 289 } 290 createNetworkScanRequest(ArrayList<RadioAccessSpecifier> ras)291 private NetworkScanRequest createNetworkScanRequest(ArrayList<RadioAccessSpecifier> ras) { 292 AvailableNetworkInfo availableNetworkInfo = 293 new AvailableNetworkInfo.Builder(TEST_SUBSCRIPTION_INFO.getSubscriptionId()) 294 .setPriority(AvailableNetworkInfo.PRIORITY_LOW) 295 .setMccMncs(new ArrayList<>(Arrays.asList("310210"))) 296 .setRadioAccessSpecifiers(ras) 297 .build(); 298 List<AvailableNetworkInfo> availableNetworkInfos = 299 new ArrayList<AvailableNetworkInfo>(); 300 availableNetworkInfos.add(availableNetworkInfo); 301 302 return mONSNetworkScanCtlr.createNetworkScanRequest(availableNetworkInfos, 303 SEARCH_PERIODICITY); 304 } 305 initONSNetworkScanCtrl()306 private void initONSNetworkScanCtrl() { 307 mReady = false; 308 309 // initializing ONSNetworkScanCtlr 310 new Thread(new Runnable() { 311 @Override 312 public void run() { 313 Looper.prepare(); 314 mONSNetworkScanCtlr = new ONSNetworkScanCtlr(mContext, mMockTelephonyManager, 315 new ONSNetworkScanCtlr.NetworkAvailableCallBack() { 316 @Override 317 public void onNetworkAvailability(List<CellInfo> results) { 318 mResults = results; 319 setReady(true); 320 } 321 322 public void onError(int error) { 323 mError = error; 324 setReady(true); 325 } 326 }); 327 328 mLooper = Looper.myLooper(); 329 setReady(true); 330 Looper.loop(); 331 } 332 }).start(); 333 334 // Wait till initialization is complete. 335 waitUntilReady(); 336 mReady = false; 337 } 338 339 @Test testGetMncMccFromCellInfoNr()340 public void testGetMncMccFromCellInfoNr() { 341 mONSNetworkScanCtlr = new ONSNetworkScanCtlr(mContext, mMockTelephonyManager, null); 342 343 CellIdentityNr cellIdentityNr = new CellIdentityNr(0, 0, 0, new int[]{0}, "111", "222", 0, 344 "", "", Collections.emptyList()); 345 346 CellInfoNr cellinfoNr = new CellInfoNr(0, true, 0, cellIdentityNr, null); 347 348 assertEquals(mONSNetworkScanCtlr.getMccMnc(cellinfoNr), "111222"); 349 } 350 } 351