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