1 /*
2  * Copyright (C) 2019 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 android.net.wifi;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.fail;
21 import static org.mockito.Mockito.validateMockitoUsage;
22 
23 import android.net.wifi.WifiUsabilityStatsEntry.ContentionTimeStats;
24 import android.net.wifi.WifiUsabilityStatsEntry.RadioStats;
25 import android.net.wifi.WifiUsabilityStatsEntry.RateStats;
26 import android.os.Parcel;
27 
28 import androidx.test.filters.SmallTest;
29 
30 import org.junit.After;
31 import org.junit.Before;
32 import org.junit.Test;
33 import org.mockito.MockitoAnnotations;
34 
35 import java.util.NoSuchElementException;
36 
37 
38 /**
39  * Unit tests for {@link android.net.wifi.WifiUsabilityStatsEntry}.
40  */
41 @SmallTest
42 public class WifiUsabilityStatsEntryTest {
43 
44     /**
45      * Setup before tests.
46      */
47     @Before
setUp()48     public void setUp() throws Exception {
49         MockitoAnnotations.initMocks(this);
50     }
51 
52     /**
53      * Clean up after tests.
54      */
55     @After
cleanup()56     public void cleanup() {
57         validateMockitoUsage();
58     }
59 
60     /**
61      * Verify parcel read/write for Wifi usability stats result.
62      */
63     @Test
verifyStatsResultWriteAndThenRead()64     public void verifyStatsResultWriteAndThenRead() throws Exception {
65         WifiUsabilityStatsEntry writeResult = createResult();
66         WifiUsabilityStatsEntry readResult = parcelWriteRead(writeResult);
67         assertWifiUsabilityStatsEntryEquals(writeResult, readResult);
68     }
69 
70     /**
71      * Verify parcel read/write for Wifi usability stats result.
72      */
73     @Test
getTimeSliceDutyCycleInPercent()74     public void getTimeSliceDutyCycleInPercent() throws Exception {
75         ContentionTimeStats[] contentionTimeStats = new ContentionTimeStats[4];
76         contentionTimeStats[0] = new ContentionTimeStats(1, 2, 3, 4);
77         contentionTimeStats[1] = new ContentionTimeStats(5, 6, 7, 8);
78         contentionTimeStats[2] = new ContentionTimeStats(9, 10, 11, 12);
79         contentionTimeStats[3] = new ContentionTimeStats(13, 14, 15, 16);
80         RateStats[] rateStats = new RateStats[2];
81         rateStats[0] = new RateStats(1, 3, 4, 7, 9, 11, 13, 15, 17);
82         rateStats[1] = new RateStats(2, 2, 3, 8, 10, 12, 14, 16, 18);
83 
84         RadioStats[] radioStats = new RadioStats[2];
85         radioStats[0] = new RadioStats(0, 10, 11, 12, 13, 14, 15, 16, 17, 18);
86         radioStats[1] = new RadioStats(1, 20, 21, 22, 23, 24, 25, 26, 27, 28);
87 
88         WifiUsabilityStatsEntry usabilityStatsEntry = new WifiUsabilityStatsEntry(
89                 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
90                 32, contentionTimeStats, rateStats, radioStats, 100, true,
91                 true, true, 23, 24, 25, true);
92         assertEquals(32, usabilityStatsEntry.getTimeSliceDutyCycleInPercent());
93 
94         WifiUsabilityStatsEntry usabilityStatsEntryWithInvalidDutyCycleValue =
95                 new WifiUsabilityStatsEntry(
96                         0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
97                         21, 22, -1, contentionTimeStats, rateStats, radioStats, 101, true, true,
98                         true, 23, 24, 25, true);
99         try {
100             usabilityStatsEntryWithInvalidDutyCycleValue.getTimeSliceDutyCycleInPercent();
101             fail();
102         } catch (NoSuchElementException e) {
103             // pass
104         }
105     }
106 
107     /**
108      * Write the provided {@link WifiUsabilityStatsEntry} to a parcel and deserialize it.
109      */
parcelWriteRead( WifiUsabilityStatsEntry writeResult)110     private static WifiUsabilityStatsEntry parcelWriteRead(
111             WifiUsabilityStatsEntry writeResult) throws Exception {
112         Parcel parcel = Parcel.obtain();
113         writeResult.writeToParcel(parcel, 0);
114         parcel.setDataPosition(0);    // Rewind data position back to the beginning for read.
115         return WifiUsabilityStatsEntry.CREATOR.createFromParcel(parcel);
116     }
117 
createResult()118     private static WifiUsabilityStatsEntry createResult() {
119         ContentionTimeStats[] contentionTimeStats = new ContentionTimeStats[4];
120         contentionTimeStats[0] = new ContentionTimeStats(1, 2, 3, 4);
121         contentionTimeStats[1] = new ContentionTimeStats(5, 6, 7, 8);
122         contentionTimeStats[2] = new ContentionTimeStats(9, 10, 11, 12);
123         contentionTimeStats[3] = new ContentionTimeStats(13, 14, 15, 16);
124         RateStats[] rateStats = new RateStats[2];
125         rateStats[0] = new RateStats(1, 3, 4, 7, 9, 11, 13, 15, 17);
126         rateStats[1] = new RateStats(2, 2, 3, 8, 10, 12, 14, 16, 18);
127 
128         RadioStats[] radioStats = new RadioStats[2];
129         radioStats[0] = new RadioStats(0, 10, 11, 12, 13, 14, 15, 16, 17, 18);
130         radioStats[1] = new RadioStats(1, 20, 21, 22, 23, 24, 25, 26, 27, 28);
131 
132         return new WifiUsabilityStatsEntry(
133                 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22,
134                 50, contentionTimeStats, rateStats, radioStats, 102, true,
135                 true, true, 23, 24, 25, true
136         );
137     }
138 
assertWifiUsabilityStatsEntryEquals( WifiUsabilityStatsEntry expected, WifiUsabilityStatsEntry actual)139     private static void assertWifiUsabilityStatsEntryEquals(
140             WifiUsabilityStatsEntry expected,
141             WifiUsabilityStatsEntry actual) {
142         assertEquals(expected.getTimeStampMillis(), actual.getTimeStampMillis());
143         assertEquals(expected.getRssi(), actual.getRssi());
144         assertEquals(expected.getLinkSpeedMbps(), actual.getLinkSpeedMbps());
145         assertEquals(expected.getTotalTxSuccess(), actual.getTotalTxSuccess());
146         assertEquals(expected.getTotalTxRetries(), actual.getTotalTxRetries());
147         assertEquals(expected.getTotalTxBad(), actual.getTotalTxBad());
148         assertEquals(expected.getTotalRxSuccess(), actual.getTotalRxSuccess());
149         assertEquals(expected.getWifiLinkLayerRadioStats().size(),
150                 actual.getWifiLinkLayerRadioStats().size());
151         for (int i = 0; i < expected.getWifiLinkLayerRadioStats().size(); i++) {
152             RadioStats expectedRadioStats = expected.getWifiLinkLayerRadioStats().get(i);
153             RadioStats actualRadioStats = actual.getWifiLinkLayerRadioStats().get(i);
154             assertEquals(expectedRadioStats.getRadioId(),
155                     actualRadioStats.getRadioId());
156             assertEquals(expectedRadioStats.getTotalRadioOnTimeMillis(),
157                     actualRadioStats.getTotalRadioOnTimeMillis());
158             assertEquals(expectedRadioStats.getTotalRadioTxTimeMillis(),
159                     actualRadioStats.getTotalRadioTxTimeMillis());
160             assertEquals(expectedRadioStats.getTotalRadioRxTimeMillis(),
161                     actualRadioStats.getTotalRadioRxTimeMillis());
162             assertEquals(expectedRadioStats.getTotalScanTimeMillis(),
163                     actualRadioStats.getTotalScanTimeMillis());
164             assertEquals(expectedRadioStats.getTotalNanScanTimeMillis(),
165                     actualRadioStats.getTotalNanScanTimeMillis());
166             assertEquals(expectedRadioStats.getTotalBackgroundScanTimeMillis(),
167                     actualRadioStats.getTotalBackgroundScanTimeMillis());
168             assertEquals(expectedRadioStats.getTotalRoamScanTimeMillis(),
169                     actualRadioStats.getTotalRoamScanTimeMillis());
170             assertEquals(expectedRadioStats.getTotalPnoScanTimeMillis(),
171                     actualRadioStats.getTotalPnoScanTimeMillis());
172             assertEquals(expectedRadioStats.getTotalHotspot2ScanTimeMillis(),
173                     actualRadioStats.getTotalHotspot2ScanTimeMillis());
174         }
175         assertEquals(expected.getTotalRadioOnTimeMillis(), actual.getTotalRadioOnTimeMillis());
176         assertEquals(expected.getTotalRadioTxTimeMillis(), actual.getTotalRadioTxTimeMillis());
177         assertEquals(expected.getTotalRadioRxTimeMillis(), actual.getTotalRadioRxTimeMillis());
178         assertEquals(expected.getTotalScanTimeMillis(), actual.getTotalScanTimeMillis());
179         assertEquals(expected.getTotalNanScanTimeMillis(), actual.getTotalNanScanTimeMillis());
180         assertEquals(expected.getTotalBackgroundScanTimeMillis(),
181                 actual.getTotalBackgroundScanTimeMillis());
182         assertEquals(expected.getTotalRoamScanTimeMillis(), actual.getTotalRoamScanTimeMillis());
183         assertEquals(expected.getTotalPnoScanTimeMillis(), actual.getTotalPnoScanTimeMillis());
184         assertEquals(expected.getTotalHotspot2ScanTimeMillis(),
185                 actual.getTotalHotspot2ScanTimeMillis());
186         assertEquals(expected.getTotalCcaBusyFreqTimeMillis(),
187                 actual.getTotalCcaBusyFreqTimeMillis());
188         assertEquals(expected.getTotalRadioOnFreqTimeMillis(),
189                 actual.getTotalRadioOnFreqTimeMillis());
190         assertEquals(expected.getTotalBeaconRx(), actual.getTotalBeaconRx());
191         assertEquals(expected.getProbeStatusSinceLastUpdate(),
192                 actual.getProbeStatusSinceLastUpdate());
193         assertEquals(expected.getProbeElapsedTimeSinceLastUpdateMillis(),
194                 actual.getProbeElapsedTimeSinceLastUpdateMillis());
195         assertEquals(expected.getProbeMcsRateSinceLastUpdate(),
196                 actual.getProbeMcsRateSinceLastUpdate());
197         assertEquals(expected.getRxLinkSpeedMbps(), actual.getRxLinkSpeedMbps());
198         assertEquals(expected.getTimeSliceDutyCycleInPercent(),
199                 actual.getTimeSliceDutyCycleInPercent());
200         assertEquals(
201                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
202                         .getContentionTimeMinMicros(),
203                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
204                         .getContentionTimeMinMicros());
205         assertEquals(
206                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
207                         .getContentionTimeMaxMicros(),
208                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
209                         .getContentionTimeMaxMicros());
210         assertEquals(
211                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
212                         .getContentionTimeAvgMicros(),
213                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
214                         .getContentionTimeAvgMicros());
215         assertEquals(
216                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
217                         .getContentionNumSamples(),
218                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BE)
219                         .getContentionNumSamples());
220         assertEquals(
221                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
222                         .getContentionTimeMinMicros(),
223                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
224                         .getContentionTimeMinMicros());
225         assertEquals(
226                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
227                         .getContentionTimeMaxMicros(),
228                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
229                         .getContentionTimeMaxMicros());
230         assertEquals(
231                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
232                         .getContentionTimeAvgMicros(),
233                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
234                         .getContentionTimeAvgMicros());
235         assertEquals(
236                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
237                         .getContentionNumSamples(),
238                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_BK)
239                         .getContentionNumSamples());
240         assertEquals(
241                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
242                         .getContentionTimeMinMicros(),
243                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
244                         .getContentionTimeMinMicros());
245         assertEquals(
246                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
247                         .getContentionTimeMaxMicros(),
248                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
249                         .getContentionTimeMaxMicros());
250         assertEquals(
251                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
252                         .getContentionTimeAvgMicros(),
253                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
254                         .getContentionTimeAvgMicros());
255         assertEquals(
256                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
257                         .getContentionNumSamples(),
258                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VI)
259                         .getContentionNumSamples());
260         assertEquals(
261                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
262                         .getContentionTimeMinMicros(),
263                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
264                         .getContentionTimeMinMicros());
265         assertEquals(
266                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
267                         .getContentionTimeMaxMicros(),
268                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
269                         .getContentionTimeMaxMicros());
270         assertEquals(
271                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
272                         .getContentionTimeAvgMicros(),
273                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
274                         .getContentionTimeAvgMicros());
275         assertEquals(
276                 expected.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
277                         .getContentionNumSamples(),
278                 actual.getContentionTimeStats(WifiUsabilityStatsEntry.WME_ACCESS_CATEGORY_VO)
279                         .getContentionNumSamples());
280         for (int i = 0; i < expected.getRateStats().size(); i++) {
281             RateStats expectedStats = expected.getRateStats().get(i);
282             RateStats actualStats = actual.getRateStats().get(i);
283             assertEquals(expectedStats.getPreamble(), actualStats.getPreamble());
284             assertEquals(expectedStats.getNumberOfSpatialStreams(),
285                     actualStats.getNumberOfSpatialStreams());
286             assertEquals(expectedStats.getBandwidthInMhz(), actualStats.getBandwidthInMhz());
287             assertEquals(expectedStats.getRateMcsIdx(), actualStats.getRateMcsIdx());
288             assertEquals(expectedStats.getBitRateInKbps(), actualStats.getBitRateInKbps());
289             assertEquals(expectedStats.getTxMpdu(), actualStats.getTxMpdu());
290             assertEquals(expectedStats.getRxMpdu(), actualStats.getRxMpdu());
291             assertEquals(expectedStats.getMpduLost(), actualStats.getMpduLost());
292             assertEquals(expectedStats.getRetries(), actualStats.getRetries());
293         }
294         assertEquals(expected.getChannelUtilizationRatio(), actual.getChannelUtilizationRatio());
295         assertEquals(expected.isThroughputSufficient(), actual.isThroughputSufficient());
296         assertEquals(expected.isWifiScoringEnabled(), actual.isWifiScoringEnabled());
297         assertEquals(expected.isCellularDataAvailable(), actual.isCellularDataAvailable());
298         assertEquals(expected.getCellularDataNetworkType(), actual.getCellularDataNetworkType());
299         assertEquals(expected.getCellularSignalStrengthDbm(),
300                 actual.getCellularSignalStrengthDbm());
301         assertEquals(expected.getCellularSignalStrengthDb(), actual.getCellularSignalStrengthDb());
302         assertEquals(expected.isSameRegisteredCell(), actual.isSameRegisteredCell());
303     }
304 }
305