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 com.google.common.truth.Truth.assertThat; 20 21 import static org.junit.Assert.assertEquals; 22 import static org.mockito.Mockito.doReturn; 23 24 import android.hardware.radio.V1_6.NrSignalStrength; 25 import android.os.Parcel; 26 import android.telephony.CellInfo; 27 import android.telephony.CellSignalStrength; 28 import android.telephony.CellSignalStrengthNr; 29 import android.telephony.ServiceState; 30 31 import com.google.common.collect.BoundType; 32 import com.google.common.collect.Range; 33 34 import org.junit.After; 35 import org.junit.Before; 36 import org.junit.Test; 37 import org.mockito.Mock; 38 39 import java.util.ArrayList; 40 import java.util.Arrays; 41 import java.util.Collections; 42 import java.util.List; 43 import java.util.stream.Collectors; 44 45 public class CellSignalStrengthNrTest extends TelephonyTest { 46 private static final int CSIRSRP = -123; 47 private static final int CSIRSRQ = -11; 48 private static final int ANOTHER_CSIRSRP = -111; 49 private static final int ANOTHER_CSIRSRQ = -12; 50 private static final int INVALID_CSIRSRP = Integer.MAX_VALUE; 51 private static final int INVALID_SSRSRP = Integer.MAX_VALUE; 52 private static final int CSISINR = 18; 53 private static final int CSICQI_TABLE_INDEX = 1; 54 private static final ArrayList<Byte> CSICQI_REPORT = 55 new ArrayList<>(Arrays.asList((byte) 3, (byte) 2, (byte) 1)); 56 private static final int SSRSRP = -112; 57 private static final int SSRSRQ = -13; 58 private static final int SSSINR = 32; 59 60 @Mock 61 ServiceState mSS; 62 63 @Before setUp()64 public void setUp() throws Exception { 65 super.setUp(this.getClass().getSimpleName()); 66 } 67 68 @After tearDown()69 public void tearDown() throws Exception { 70 super.tearDown(); 71 } 72 getCsiCqiList()73 private List<Integer> getCsiCqiList() { 74 return CSICQI_REPORT.stream() 75 .map(cqi -> new Integer(Byte.toUnsignedInt(cqi))) 76 .collect(Collectors.toList()); 77 } 78 79 @Test testGetMethod()80 public void testGetMethod() { 81 // GIVEN an instance of CellSignalStrengthNr 82 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 83 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 84 85 // THEN the get method should return correct value 86 assertThat(css.getCsiRsrp()).isEqualTo(CSIRSRP); 87 assertThat(css.getCsiRsrq()).isEqualTo(CSIRSRQ); 88 assertThat(css.getCsiSinr()).isEqualTo(CSISINR); 89 assertThat(css.getCsiCqiTableIndex()).isEqualTo(CSICQI_TABLE_INDEX); 90 assertThat(css.getCsiCqiReport()).isEqualTo(getCsiCqiList()); 91 assertThat(css.getSsRsrp()).isEqualTo(SSRSRP); 92 assertThat(css.getSsRsrq()).isEqualTo(SSRSRQ); 93 assertThat(css.getSsSinr()).isEqualTo(SSSINR); 94 assertThat(css.getDbm()).isEqualTo(SSRSRP); 95 } 96 97 @Test testGetMethodWithHal()98 public void testGetMethodWithHal() { 99 // GIVEN an instance of NrSignalStrength with some positive values 100 NrSignalStrength nrSignalStrength = new NrSignalStrength(); 101 nrSignalStrength.base.csiRsrp = -CSIRSRP; 102 nrSignalStrength.base.csiRsrq = -CSIRSRQ; 103 nrSignalStrength.base.csiSinr = CSISINR; 104 nrSignalStrength.csiCqiTableIndex = CSICQI_TABLE_INDEX; 105 nrSignalStrength.csiCqiReport = CSICQI_REPORT; 106 nrSignalStrength.base.ssRsrp = -SSRSRP; 107 nrSignalStrength.base.ssRsrq = -SSRSRQ; 108 nrSignalStrength.base.ssSinr = SSSINR; 109 110 // THEN the get method should return the correct value 111 CellSignalStrengthNr css = new CellSignalStrengthNr(nrSignalStrength); 112 assertThat(css.getCsiRsrp()).isEqualTo(CSIRSRP); 113 assertThat(css.getCsiRsrq()).isEqualTo(CSIRSRQ); 114 assertThat(css.getCsiSinr()).isEqualTo(CSISINR); 115 assertThat(css.getCsiCqiTableIndex()).isEqualTo(CSICQI_TABLE_INDEX); 116 assertThat(css.getCsiCqiReport()).isEqualTo(getCsiCqiList()); 117 assertThat(css.getSsRsrp()).isEqualTo(SSRSRP); 118 assertThat(css.getSsRsrq()).isEqualTo(SSRSRQ); 119 assertThat(css.getSsSinr()).isEqualTo(SSSINR); 120 assertThat(css.getDbm()).isEqualTo(SSRSRP); 121 } 122 123 @Test testUnavailableValueWithHal()124 public void testUnavailableValueWithHal() { 125 // GIVEN an instance of NrSignalStrength 126 NrSignalStrength nrSignalStrength = new NrSignalStrength(); 127 nrSignalStrength.base.csiRsrp = CellInfo.UNAVAILABLE; 128 nrSignalStrength.base.csiRsrq = CellInfo.UNAVAILABLE; 129 nrSignalStrength.base.csiSinr = CellInfo.UNAVAILABLE; 130 nrSignalStrength.csiCqiTableIndex = CellInfo.UNAVAILABLE; 131 nrSignalStrength.csiCqiReport = new ArrayList<Byte>(); 132 nrSignalStrength.base.ssRsrp = CellInfo.UNAVAILABLE; 133 nrSignalStrength.base.ssRsrq = CellInfo.UNAVAILABLE; 134 nrSignalStrength.base.ssSinr = CellInfo.UNAVAILABLE; 135 136 // THEN the get method should return unavailable value 137 CellSignalStrengthNr css = new CellSignalStrengthNr(nrSignalStrength); 138 assertThat(css.getCsiRsrp()).isEqualTo(CellInfo.UNAVAILABLE); 139 assertThat(css.getCsiRsrq()).isEqualTo(CellInfo.UNAVAILABLE); 140 assertThat(css.getCsiSinr()).isEqualTo(CellInfo.UNAVAILABLE); 141 assertThat(css.getCsiCqiTableIndex()).isEqualTo(CellInfo.UNAVAILABLE); 142 assertThat(css.getCsiCqiReport()).isEqualTo(Collections.emptyList()); 143 assertThat(css.getSsRsrp()).isEqualTo(CellInfo.UNAVAILABLE); 144 assertThat(css.getSsRsrq()).isEqualTo(CellInfo.UNAVAILABLE); 145 assertThat(css.getSsSinr()).isEqualTo(CellInfo.UNAVAILABLE); 146 assertThat(css.getDbm()).isEqualTo(CellInfo.UNAVAILABLE); 147 } 148 149 @Test testEquals_sameParameters()150 public void testEquals_sameParameters() { 151 // GIVEN an instance of CellSignalStrengthNr and another object with the same parameters 152 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 153 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 154 CellSignalStrengthNr anotherCss = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 155 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 156 157 // THEN this two objects are equivalent 158 assertThat(css).isEqualTo(anotherCss); 159 } 160 161 @Test testEquals_differentParameters()162 public void testEquals_differentParameters() { 163 // GIVEN an instance of CellSignalStrengthNr and another object with some different 164 // parameters 165 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 166 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 167 CellSignalStrengthNr anotherCss = new CellSignalStrengthNr(ANOTHER_CSIRSRP, 168 ANOTHER_CSIRSRQ, CSISINR, CSICQI_TABLE_INDEX, CSICQI_REPORT, 169 SSRSRP, SSRSRQ, SSSINR); 170 171 // THEN this two objects are different 172 assertThat(css).isNotEqualTo(anotherCss); 173 } 174 175 @Test testAusLevel_validValue()176 public void testAusLevel_validValue() { 177 // GIVEN an instance of CellSignalStrengthNr with valid csirsrp 178 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 179 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 180 181 // THEN the asu level is in range [0, 97] 182 assertThat(css.getAsuLevel()).isIn(Range.range(0, BoundType.CLOSED, 97, BoundType.CLOSED)); 183 } 184 185 @Test testAsuLevel_invalidValue()186 public void testAsuLevel_invalidValue() { 187 // GIVEN an instance of CellSignalStrengthNr with invalid csirsrp 188 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 189 CSICQI_TABLE_INDEX, CSICQI_REPORT, INVALID_SSRSRP, SSRSRQ, SSSINR); 190 191 // THEN the asu level is unknown 192 assertThat(css.getAsuLevel()).isEqualTo(CellSignalStrengthNr.UNKNOWN_ASU_LEVEL); 193 } 194 195 @Test testSignalLevel_validValue()196 public void testSignalLevel_validValue() { 197 for (int ssRsrp = -140; ssRsrp <= -44; ssRsrp++) { 198 // GIVEN an instance of CellSignalStrengthNr with valid csirsrp 199 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 200 CSICQI_TABLE_INDEX, CSICQI_REPORT, INVALID_SSRSRP, SSRSRQ, SSSINR); 201 202 // THEN the signal level is valid 203 assertThat(css.getLevel()).isIn(Range.range( 204 CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN, BoundType.CLOSED, 205 CellSignalStrength.SIGNAL_STRENGTH_GREAT, BoundType.CLOSED)); 206 } 207 } 208 209 @Test testSignalLevel_invalidValue()210 public void testSignalLevel_invalidValue() { 211 // GIVEN an instance of CellSignalStrengthNr with invalid csirsrp 212 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 213 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 214 215 // THEN the signal level is unknown 216 assertThat(css.getLevel()).isEqualTo(CellSignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN); 217 } 218 219 @Test testParcel()220 public void testParcel() { 221 // GIVEN an instance of CellSignalStrengthNr 222 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, 223 CSICQI_TABLE_INDEX, CSICQI_REPORT, SSRSRP, SSRSRQ, SSSINR); 224 225 // WHEN write the object to parcel and create another object with that parcel 226 Parcel parcel = Parcel.obtain(); 227 css.writeToParcel(parcel, 0 /* type */); 228 parcel.setDataPosition(0); 229 CellSignalStrengthNr anotherCss = CellSignalStrengthNr.CREATOR.createFromParcel(parcel); 230 231 // THEN the new object is equal to the old one 232 assertThat(anotherCss).isEqualTo(css); 233 assertThat(anotherCss.getCsiRsrp()).isEqualTo(CSIRSRP); 234 assertThat(anotherCss.getCsiRsrq()).isEqualTo(CSIRSRQ); 235 assertThat(anotherCss.getCsiSinr()).isEqualTo(CSISINR); 236 assertThat(css.getCsiCqiTableIndex()).isEqualTo(CSICQI_TABLE_INDEX); 237 assertThat(css.getCsiCqiReport()).isEqualTo(getCsiCqiList()); 238 assertThat(anotherCss.getSsRsrp()).isEqualTo(SSRSRP); 239 assertThat(anotherCss.getSsRsrq()).isEqualTo(SSRSRQ); 240 assertThat(anotherCss.getSsSinr()).isEqualTo(SSSINR); 241 } 242 243 @Test testLevel()244 public void testLevel() { 245 CellSignalStrengthNr css = new CellSignalStrengthNr(CSIRSRP, CSIRSRQ, CSISINR, SSRSRP, 246 SSRSRQ, SSSINR); 247 248 // No keys in the bundle - should use RSRP and default levels. 249 css.updateLevel(null, null); 250 assertEquals(0 /* NONE or UNKNOWN */, css.getLevel()); 251 252 doReturn(10).when(mSS).getArfcnRsrpBoost(); 253 // Add rsrp boost and level should change to 1 - POOR 254 css.updateLevel(null, mSS); 255 assertEquals(1 /* MODERATE */, css.getLevel()); 256 } 257 } 258