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