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 17 package com.android.internal.telephony; 18 19 import static org.junit.Assert.assertEquals; 20 import static org.junit.Assert.assertTrue; 21 22 import android.os.Parcel; 23 import android.os.PersistableBundle; 24 import android.telephony.CarrierConfigManager; 25 import android.telephony.CellInfo; 26 import android.telephony.CellSignalStrength; 27 import android.telephony.CellSignalStrengthCdma; 28 import android.telephony.CellSignalStrengthGsm; 29 import android.telephony.CellSignalStrengthLte; 30 import android.telephony.CellSignalStrengthNr; 31 import android.telephony.CellSignalStrengthTdscdma; 32 import android.telephony.CellSignalStrengthWcdma; 33 import android.telephony.SignalStrength; 34 35 import androidx.test.filters.SmallTest; 36 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.junit.runners.JUnit4; 40 41 import java.util.ArrayList; 42 import java.util.Arrays; 43 import java.util.List; 44 45 /** Unit tests for {@link IpSecConfig}. */ 46 @SmallTest 47 @RunWith(JUnit4.class) 48 public class SignalStrengthTest { 49 private static final int[] DEFAULT_LTE_RSRP_THRESHOLDS = { 50 -128, // SIGNAL_STRENGTH_POOR 51 -118, // SIGNAL_STRENGTH_MODERATE 52 -108, // SIGNAL_STRENGTH_GOOD 53 -98 }; // SIGNAL_STRENGTH_GREAT 54 55 private static final int[] DEFAULT_LTE_RSRQ_THRESHOLDS = { 56 -19, // SIGNAL_STRENGTH_POOR 57 -17, // SIGNAL_STRENGTH_MODERATE 58 -14, // SIGNAL_STRENGTH_GOOD 59 -12 }; // SIGNAL_STRENGTH_GREAT 60 61 private static final int[] DEFAULT_LTE_RSSNR_THRESHOLDS = { 62 -3, // SIGNAL_STRENGTH_POOR 63 1, // SIGNAL_STRENGTH_MODERATE 64 5, // SIGNAL_STRENGTH_GOOD 65 13 }; // SIGNAL_STRENGTH_GREAT 66 67 private static final int[] DEFAULT_5G_NR_SSRSRP_THRESHOLDS = { 68 -125, // SIGNAL_STRENGTH_POOR 69 -115, // SIGNAL_STRENGTH_MODERATE 70 -105, // SIGNAL_STRENGTH_GOOD 71 -95 }; // SIGNAL_STRENGTH_GREAT 72 73 @Test testDefaults()74 public void testDefaults() throws Exception { 75 SignalStrength s = new SignalStrength(); 76 assertEquals(CellInfo.UNAVAILABLE, s.getCdmaDbm()); 77 assertEquals(CellInfo.UNAVAILABLE, s.getCdmaEcio()); 78 assertEquals(CellInfo.UNAVAILABLE, s.getEvdoDbm()); 79 assertEquals(CellInfo.UNAVAILABLE, s.getEvdoEcio()); 80 assertEquals(CellInfo.UNAVAILABLE, s.getEvdoSnr()); 81 assertEquals(CellInfo.UNAVAILABLE, s.getGsmBitErrorRate()); 82 // getGsmSignalStrength is an oddball because internally it actually returns an AsuLevel 83 // rather than a dBm value. For backwards compatibility reasons, this is left as the 84 // RSSI ASU value [0-31], 99. 85 assertEquals(99, s.getGsmSignalStrength()); 86 assertEquals(true, s.isGsm()); 87 } 88 89 @Test testParcelUnparcel()90 public void testParcelUnparcel() throws Exception { 91 assertParcelingIsLossless(new SignalStrength()); 92 93 ArrayList<Byte> NrCqiReport = new ArrayList<>( 94 Arrays.asList((byte) 3, (byte) 2 , (byte) 1)); 95 SignalStrength s = new SignalStrength( 96 new CellSignalStrengthCdma(-93, -132, -89, -125, 5), 97 new CellSignalStrengthGsm(-79, 2, 5), 98 new CellSignalStrengthWcdma(-94, 4, -102, -5), 99 new CellSignalStrengthTdscdma(-95, 2, -103), 100 new CellSignalStrengthLte(-85, -91, -6, -10, 1, 12, 1), 101 new CellSignalStrengthNr(-91, -6, 3, 1, NrCqiReport, -80, -7, 4)); 102 assertParcelingIsLossless(s); 103 104 PersistableBundle bundle = new PersistableBundle(); 105 bundle.putIntArray( 106 CarrierConfigManager.KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY, 107 DEFAULT_LTE_RSRQ_THRESHOLDS); 108 bundle.putIntArray( 109 CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, 110 DEFAULT_LTE_RSRP_THRESHOLDS); 111 bundle.putIntArray( 112 CarrierConfigManager.KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY, 113 DEFAULT_LTE_RSSNR_THRESHOLDS); 114 bundle.putIntArray( 115 CarrierConfigManager.KEY_5G_NR_SSRSRP_THRESHOLDS_INT_ARRAY, 116 DEFAULT_5G_NR_SSRSRP_THRESHOLDS); 117 118 s.updateLevel(bundle, null); 119 assertParcelingIsLossless(s); 120 } 121 assertParcelingIsLossless(SignalStrength ssi)122 private void assertParcelingIsLossless(SignalStrength ssi) throws Exception { 123 Parcel p = Parcel.obtain(); 124 ssi.writeToParcel(p, 0); 125 p.setDataPosition(0); 126 SignalStrength sso = SignalStrength.CREATOR.createFromParcel(p); 127 assertTrue(sso.equals(ssi)); 128 } 129 130 @Test testGetCellSignalStrengths()131 public void testGetCellSignalStrengths() throws Exception { 132 CellSignalStrengthLte lte = new CellSignalStrengthLte(-85, -91, -6, -10, 1, 12, 1); 133 CellSignalStrengthGsm gsm = new CellSignalStrengthGsm(-79, 2, 5); 134 CellSignalStrengthCdma cdma = new CellSignalStrengthCdma(-93, -132, -89, -125, 5); 135 CellSignalStrengthWcdma wcdma = new CellSignalStrengthWcdma(-94, 4, -102, -5); 136 CellSignalStrengthTdscdma tdscdma = new CellSignalStrengthTdscdma(-95, 2, -103); 137 138 // Test that a single object is properly stored and returned by getCellSignalStrengths() 139 SignalStrength s = new SignalStrength( 140 new CellSignalStrengthCdma(), 141 gsm, 142 new CellSignalStrengthWcdma(), 143 new CellSignalStrengthTdscdma(), 144 new CellSignalStrengthLte(), 145 new CellSignalStrengthNr()); 146 147 List<CellSignalStrength> css = s.getCellSignalStrengths(); 148 assertEquals(1, css.size()); 149 assertTrue(gsm.equals(css.get(0))); 150 151 // Test that a multiple objects are properly stored and returned by getCellSignalStrengths() 152 s = new SignalStrength( 153 cdma, 154 new CellSignalStrengthGsm(), 155 new CellSignalStrengthWcdma(), 156 new CellSignalStrengthTdscdma(), 157 lte, 158 new CellSignalStrengthNr()); 159 160 css = s.getCellSignalStrengths(); 161 assertEquals(2, css.size()); 162 assertTrue(css.contains(cdma)); 163 assertTrue(css.contains(lte)); 164 } 165 createSignalStrengthLteReportRsrq(int lteRsrp, int lteRsrq)166 private static SignalStrength createSignalStrengthLteReportRsrq(int lteRsrp, int lteRsrq) { 167 168 CellSignalStrengthLte lte = new CellSignalStrengthLte( 169 -89, // rssi 170 lteRsrp, // rsrp 171 lteRsrq, // rsrq 172 -25, // rssnr 173 CellInfo.UNAVAILABLE, // cqiTableIndex 174 CellInfo.UNAVAILABLE, // cqi 175 CellInfo.UNAVAILABLE); // timingAdvance 176 177 SignalStrength signalStrength = new SignalStrength( 178 new CellSignalStrengthCdma(), 179 new CellSignalStrengthGsm(), 180 new CellSignalStrengthWcdma(), 181 new CellSignalStrengthTdscdma(), 182 lte, 183 new CellSignalStrengthNr()); 184 185 PersistableBundle bundle = new PersistableBundle(); 186 bundle.putInt( 187 CarrierConfigManager.KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT, 188 CellSignalStrengthLte.USE_RSRP | CellSignalStrengthLte.USE_RSRQ); 189 bundle.putIntArray( 190 CarrierConfigManager.KEY_LTE_RSRQ_THRESHOLDS_INT_ARRAY, 191 DEFAULT_LTE_RSRQ_THRESHOLDS); 192 bundle.putIntArray( 193 CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, 194 DEFAULT_LTE_RSRP_THRESHOLDS); 195 signalStrength.updateLevel(bundle, null); 196 return signalStrength; 197 } 198 createSignalStrengthLteReportRssnr(int lteRsrp, int lteRssnr)199 private static SignalStrength createSignalStrengthLteReportRssnr(int lteRsrp, int lteRssnr) { 200 201 CellSignalStrengthLte lte = new CellSignalStrengthLte( 202 -89, // rssi 203 lteRsrp, // rsrp 204 15, // rsrq 205 lteRssnr, // rssnr 206 CellInfo.UNAVAILABLE, // cqiTableIndex 207 CellInfo.UNAVAILABLE, // cqi 208 CellInfo.UNAVAILABLE); // timingAdvance 209 210 SignalStrength signalStrength = new SignalStrength( 211 new CellSignalStrengthCdma(), 212 new CellSignalStrengthGsm(), 213 new CellSignalStrengthWcdma(), 214 new CellSignalStrengthTdscdma(), 215 lte, 216 new CellSignalStrengthNr()); 217 218 PersistableBundle bundle = new PersistableBundle(); 219 bundle.putInt( 220 CarrierConfigManager.KEY_PARAMETERS_USED_FOR_LTE_SIGNAL_BAR_INT, 221 CellSignalStrengthLte.USE_RSRP | CellSignalStrengthLte.USE_RSSNR); 222 bundle.putIntArray( 223 CarrierConfigManager.KEY_LTE_RSRP_THRESHOLDS_INT_ARRAY, 224 DEFAULT_LTE_RSRP_THRESHOLDS); 225 bundle.putIntArray( 226 CarrierConfigManager.KEY_LTE_RSSNR_THRESHOLDS_INT_ARRAY, 227 DEFAULT_LTE_RSSNR_THRESHOLDS); 228 signalStrength.updateLevel(bundle, null); 229 return signalStrength; 230 } 231 232 @Test testValidateInput()233 public void testValidateInput() throws Exception { 234 235 SignalStrength ss; 236 237 // Input value of RSRQ: 4[dB] 238 ss = createSignalStrengthLteReportRsrq(-60, 4); 239 assertEquals(SignalStrength.INVALID, ss.getLteRsrq()); 240 241 // Input value of RSRQ: 3[dB] 242 ss = createSignalStrengthLteReportRsrq(-60, 3); 243 assertEquals(3, ss.getLteRsrq()); 244 245 // Input value of RSRQ: -34[dB] 246 ss = createSignalStrengthLteReportRsrq(-60, -34); 247 assertEquals(-34, ss.getLteRsrq()); 248 249 // Input value of RSRQ: -35[dB] 250 ss = createSignalStrengthLteReportRsrq(-60, -35); 251 assertEquals(SignalStrength.INVALID, ss.getLteRsrq()); 252 253 // Input value of RSSNR: 31[dB] 254 ss = createSignalStrengthLteReportRssnr(-60, 31); 255 assertEquals(SignalStrength.INVALID, ss.getLteRssnr()); 256 257 // Input value of RSSNR: 30[dB] 258 ss = createSignalStrengthLteReportRssnr(-60, 30); 259 assertEquals(30, ss.getLteRssnr()); 260 261 // Input value of RSSNR: -20[dB] 262 ss = createSignalStrengthLteReportRssnr(60, -20); 263 assertEquals(-20, ss.getLteRssnr()); 264 265 // Input value of RSSNR: -21[dB] 266 ss = createSignalStrengthLteReportRssnr(60, -21); 267 assertEquals(SignalStrength.INVALID, ss.getLteRssnr()); 268 } 269 270 @Test testRsrqThresholds_rsrp_great()271 public void testRsrqThresholds_rsrp_great() throws Exception { 272 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 273 createSignalStrengthLteReportRsrq(-98, -34).getLteLevel()); 274 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 275 createSignalStrengthLteReportRsrq(-98, -19).getLteLevel()); 276 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 277 createSignalStrengthLteReportRsrq(-98, -17).getLteLevel()); 278 assertEquals(SignalStrength.SIGNAL_STRENGTH_GOOD, 279 createSignalStrengthLteReportRsrq(-98, -14).getLteLevel()); 280 assertEquals(SignalStrength.SIGNAL_STRENGTH_GREAT, 281 createSignalStrengthLteReportRsrq(-98, -12).getLteLevel()); 282 } 283 284 @Test testRsrqThresholds_rsrp_good()285 public void testRsrqThresholds_rsrp_good() throws Exception { 286 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 287 createSignalStrengthLteReportRsrq(-108, -34).getLteLevel()); 288 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 289 createSignalStrengthLteReportRsrq(-108, -19).getLteLevel()); 290 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 291 createSignalStrengthLteReportRsrq(-108, -17).getLteLevel()); 292 assertEquals(SignalStrength.SIGNAL_STRENGTH_GOOD, 293 createSignalStrengthLteReportRsrq(-108, -14).getLteLevel()); 294 assertEquals(SignalStrength.SIGNAL_STRENGTH_GOOD, 295 createSignalStrengthLteReportRsrq(-108, -12).getLteLevel()); 296 } 297 298 @Test testRsrqThresholds_rsrp_moderate()299 public void testRsrqThresholds_rsrp_moderate() throws Exception { 300 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 301 createSignalStrengthLteReportRsrq(-118, -34).getLteLevel()); 302 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 303 createSignalStrengthLteReportRsrq(-118, -19).getLteLevel()); 304 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 305 createSignalStrengthLteReportRsrq(-118, -17).getLteLevel()); 306 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 307 createSignalStrengthLteReportRsrq(-118, -14).getLteLevel()); 308 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 309 createSignalStrengthLteReportRsrq(-118, -12).getLteLevel()); 310 } 311 312 @Test testRsrqThresholds_rsrp_poor()313 public void testRsrqThresholds_rsrp_poor() throws Exception { 314 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 315 createSignalStrengthLteReportRsrq(-128, -34).getLteLevel()); 316 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 317 createSignalStrengthLteReportRsrq(-128, -19).getLteLevel()); 318 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 319 createSignalStrengthLteReportRsrq(-128, -17).getLteLevel()); 320 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 321 createSignalStrengthLteReportRsrq(-128, -14).getLteLevel()); 322 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 323 createSignalStrengthLteReportRsrq(-128, -12).getLteLevel()); 324 } 325 326 @Test testRsrqThresholds_rsrp_unknown()327 public void testRsrqThresholds_rsrp_unknown() throws Exception { 328 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 329 createSignalStrengthLteReportRsrq(-138, -34).getLteLevel()); 330 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 331 createSignalStrengthLteReportRsrq(-138, -19).getLteLevel()); 332 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 333 createSignalStrengthLteReportRsrq(-138, -17).getLteLevel()); 334 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 335 createSignalStrengthLteReportRsrq(-138, -14).getLteLevel()); 336 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 337 createSignalStrengthLteReportRsrq(-138, -12).getLteLevel()); 338 } 339 340 @Test testRssnrThresholds_rsrp_great()341 public void testRssnrThresholds_rsrp_great() throws Exception { 342 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 343 createSignalStrengthLteReportRssnr(-98, -20).getLteLevel()); 344 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 345 createSignalStrengthLteReportRssnr(-98, -3).getLteLevel()); 346 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 347 createSignalStrengthLteReportRssnr(-98, 1).getLteLevel()); 348 assertEquals(SignalStrength.SIGNAL_STRENGTH_GOOD, 349 createSignalStrengthLteReportRssnr(-98, 5).getLteLevel()); 350 assertEquals(SignalStrength.SIGNAL_STRENGTH_GREAT, 351 createSignalStrengthLteReportRssnr(-98, 13).getLteLevel()); 352 } 353 354 @Test testRssnrThresholds_rsrp_good()355 public void testRssnrThresholds_rsrp_good() throws Exception { 356 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 357 createSignalStrengthLteReportRssnr(-108, -20).getLteLevel()); 358 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 359 createSignalStrengthLteReportRssnr(-108, -3).getLteLevel()); 360 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 361 createSignalStrengthLteReportRssnr(-108, 1).getLteLevel()); 362 assertEquals(SignalStrength.SIGNAL_STRENGTH_GOOD, 363 createSignalStrengthLteReportRssnr(-108, 5).getLteLevel()); 364 assertEquals(SignalStrength.SIGNAL_STRENGTH_GOOD, 365 createSignalStrengthLteReportRssnr(-108, 13).getLteLevel()); 366 } 367 368 @Test testRssnrThresholds_rsrp_moderate()369 public void testRssnrThresholds_rsrp_moderate() throws Exception { 370 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 371 createSignalStrengthLteReportRssnr(-118, -20).getLteLevel()); 372 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 373 createSignalStrengthLteReportRssnr(-118, -3).getLteLevel()); 374 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 375 createSignalStrengthLteReportRssnr(-118, 1).getLteLevel()); 376 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 377 createSignalStrengthLteReportRssnr(-118, 5).getLteLevel()); 378 assertEquals(SignalStrength.SIGNAL_STRENGTH_MODERATE, 379 createSignalStrengthLteReportRssnr(-118, 13).getLteLevel()); 380 } 381 382 @Test testRssnrThresholds_rsrp_poor()383 public void testRssnrThresholds_rsrp_poor() throws Exception { 384 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 385 createSignalStrengthLteReportRssnr(-128, -20).getLteLevel()); 386 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 387 createSignalStrengthLteReportRssnr(-128, -3).getLteLevel()); 388 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 389 createSignalStrengthLteReportRssnr(-128, 1).getLteLevel()); 390 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 391 createSignalStrengthLteReportRssnr(-128, 5).getLteLevel()); 392 assertEquals(SignalStrength.SIGNAL_STRENGTH_POOR, 393 createSignalStrengthLteReportRssnr(-128, 13).getLteLevel()); 394 } 395 396 @Test testRssnrThresholds_rsrp_unknown()397 public void testRssnrThresholds_rsrp_unknown() throws Exception { 398 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 399 createSignalStrengthLteReportRssnr(-138, -20).getLteLevel()); 400 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 401 createSignalStrengthLteReportRssnr(-138, -3).getLteLevel()); 402 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 403 createSignalStrengthLteReportRssnr(-138, 1).getLteLevel()); 404 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 405 createSignalStrengthLteReportRssnr(-138, 5).getLteLevel()); 406 assertEquals(SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, 407 createSignalStrengthLteReportRssnr(-138, 13).getLteLevel()); 408 } 409 } 410 411