xref: /aosp_15_r20/system/chre/chpp/test/wwan_convert_test.cpp (revision 84e339476a462649f82315436d70fd732297a399)
1*84e33947SAndroid Build Coastguard Worker /*
2*84e33947SAndroid Build Coastguard Worker  * Copyright (C) 2020 The Android Open Source Project
3*84e33947SAndroid Build Coastguard Worker  *
4*84e33947SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*84e33947SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*84e33947SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*84e33947SAndroid Build Coastguard Worker  *
8*84e33947SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*84e33947SAndroid Build Coastguard Worker  *
10*84e33947SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*84e33947SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*84e33947SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*84e33947SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*84e33947SAndroid Build Coastguard Worker  * limitations under the License.
15*84e33947SAndroid Build Coastguard Worker  */
16*84e33947SAndroid Build Coastguard Worker 
17*84e33947SAndroid Build Coastguard Worker #include <gtest/gtest.h>
18*84e33947SAndroid Build Coastguard Worker #include <stddef.h>
19*84e33947SAndroid Build Coastguard Worker 
20*84e33947SAndroid Build Coastguard Worker #include <string.h>
21*84e33947SAndroid Build Coastguard Worker 
22*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wwan_types.h"
23*84e33947SAndroid Build Coastguard Worker #include "chpp/memory.h"
24*84e33947SAndroid Build Coastguard Worker 
25*84e33947SAndroid Build Coastguard Worker namespace {
26*84e33947SAndroid Build Coastguard Worker 
27*84e33947SAndroid Build Coastguard Worker // clang-format off
28*84e33947SAndroid Build Coastguard Worker const chreWwanCellInfo kChreCells[] = {
29*84e33947SAndroid Build Coastguard Worker   {
30*84e33947SAndroid Build Coastguard Worker     .timeStamp = 1234,
31*84e33947SAndroid Build Coastguard Worker     .cellInfoType = CHRE_WWAN_CELL_INFO_TYPE_LTE,
32*84e33947SAndroid Build Coastguard Worker     .timeStampType = CHRE_WWAN_CELL_TIMESTAMP_TYPE_MODEM,
33*84e33947SAndroid Build Coastguard Worker     .registered = 1,
34*84e33947SAndroid Build Coastguard Worker     .reserved = 111,  // ignored
35*84e33947SAndroid Build Coastguard Worker     .CellInfo = {
36*84e33947SAndroid Build Coastguard Worker       .lte = {
37*84e33947SAndroid Build Coastguard Worker         .cellIdentityLte = {
38*84e33947SAndroid Build Coastguard Worker           .mcc = 777,
39*84e33947SAndroid Build Coastguard Worker           .mnc = 888,
40*84e33947SAndroid Build Coastguard Worker           .ci = 4321,
41*84e33947SAndroid Build Coastguard Worker           .pci = 333,
42*84e33947SAndroid Build Coastguard Worker           .tac = 9876,
43*84e33947SAndroid Build Coastguard Worker           .earfcn = 5432,
44*84e33947SAndroid Build Coastguard Worker         },
45*84e33947SAndroid Build Coastguard Worker         .signalStrengthLte = {
46*84e33947SAndroid Build Coastguard Worker           .signalStrength = 27,
47*84e33947SAndroid Build Coastguard Worker           .rsrp = 96,
48*84e33947SAndroid Build Coastguard Worker           .rsrq = 18,
49*84e33947SAndroid Build Coastguard Worker           .rssnr = 157,
50*84e33947SAndroid Build Coastguard Worker           .cqi = 13,
51*84e33947SAndroid Build Coastguard Worker           .timingAdvance = INT32_MAX,
52*84e33947SAndroid Build Coastguard Worker         }
53*84e33947SAndroid Build Coastguard Worker       }
54*84e33947SAndroid Build Coastguard Worker     }
55*84e33947SAndroid Build Coastguard Worker   },
56*84e33947SAndroid Build Coastguard Worker   {
57*84e33947SAndroid Build Coastguard Worker     .timeStamp = 1235,
58*84e33947SAndroid Build Coastguard Worker     .cellInfoType = CHRE_WWAN_CELL_INFO_TYPE_WCDMA,
59*84e33947SAndroid Build Coastguard Worker     .timeStampType = CHRE_WWAN_CELL_TIMESTAMP_TYPE_ANTENNA,
60*84e33947SAndroid Build Coastguard Worker     .registered = 0,
61*84e33947SAndroid Build Coastguard Worker     .CellInfo = {
62*84e33947SAndroid Build Coastguard Worker       .wcdma = {
63*84e33947SAndroid Build Coastguard Worker         .cellIdentityWcdma = {
64*84e33947SAndroid Build Coastguard Worker           .mcc = 123,
65*84e33947SAndroid Build Coastguard Worker           .mnc = 456,
66*84e33947SAndroid Build Coastguard Worker           .lac = 789,
67*84e33947SAndroid Build Coastguard Worker           .cid = 012,
68*84e33947SAndroid Build Coastguard Worker           .psc = 345,
69*84e33947SAndroid Build Coastguard Worker           .uarfcn = 678,
70*84e33947SAndroid Build Coastguard Worker         },
71*84e33947SAndroid Build Coastguard Worker         .signalStrengthWcdma = {
72*84e33947SAndroid Build Coastguard Worker           .signalStrength = 99,
73*84e33947SAndroid Build Coastguard Worker           .bitErrorRate = INT32_MAX,
74*84e33947SAndroid Build Coastguard Worker         }
75*84e33947SAndroid Build Coastguard Worker       }
76*84e33947SAndroid Build Coastguard Worker     }
77*84e33947SAndroid Build Coastguard Worker   },
78*84e33947SAndroid Build Coastguard Worker };
79*84e33947SAndroid Build Coastguard Worker const chreWwanCellInfoResult kChreResultOneCell = {
80*84e33947SAndroid Build Coastguard Worker   .errorCode = 0,
81*84e33947SAndroid Build Coastguard Worker   .cellInfoCount = 1,
82*84e33947SAndroid Build Coastguard Worker   .cells = kChreCells,
83*84e33947SAndroid Build Coastguard Worker };
84*84e33947SAndroid Build Coastguard Worker const chreWwanCellInfoResult kChreResultTwoCell = {
85*84e33947SAndroid Build Coastguard Worker   .errorCode = 0,
86*84e33947SAndroid Build Coastguard Worker   .cellInfoCount = 2,
87*84e33947SAndroid Build Coastguard Worker   .cells = kChreCells,
88*84e33947SAndroid Build Coastguard Worker };
89*84e33947SAndroid Build Coastguard Worker // clang-format on
90*84e33947SAndroid Build Coastguard Worker 
compareCellInfo(const chreWwanCellInfo * chre,const ChppWwanCellInfo * chppIn)91*84e33947SAndroid Build Coastguard Worker void compareCellInfo(const chreWwanCellInfo *chre,
92*84e33947SAndroid Build Coastguard Worker                      const ChppWwanCellInfo *chppIn) {
93*84e33947SAndroid Build Coastguard Worker   // Local variable needed to avoid unaligned memory access.
94*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfo chppLocal;
95*84e33947SAndroid Build Coastguard Worker   memcpy(&chppLocal, chppIn, sizeof(ChppWwanCellInfo));
96*84e33947SAndroid Build Coastguard Worker   const ChppWwanCellInfo *chpp = &chppLocal;
97*84e33947SAndroid Build Coastguard Worker 
98*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->timeStamp, chre->timeStamp);
99*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cellInfoType, chre->cellInfoType);
100*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->timeStampType, chre->timeStampType);
101*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->registered, chre->registered);
102*84e33947SAndroid Build Coastguard Worker 
103*84e33947SAndroid Build Coastguard Worker   switch (chpp->cellInfoType) {
104*84e33947SAndroid Build Coastguard Worker     case CHRE_WWAN_CELL_INFO_TYPE_LTE:
105*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.cellIdentityLte.mcc,
106*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.cellIdentityLte.mcc);
107*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.cellIdentityLte.mnc,
108*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.cellIdentityLte.mnc);
109*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.cellIdentityLte.ci,
110*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.cellIdentityLte.ci);
111*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.cellIdentityLte.pci,
112*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.cellIdentityLte.pci);
113*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.cellIdentityLte.tac,
114*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.cellIdentityLte.tac);
115*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.cellIdentityLte.earfcn,
116*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.cellIdentityLte.earfcn);
117*84e33947SAndroid Build Coastguard Worker 
118*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.signalStrengthLte.signalStrength,
119*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.signalStrengthLte.signalStrength);
120*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.signalStrengthLte.rsrp,
121*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.signalStrengthLte.rsrp);
122*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.signalStrengthLte.rsrq,
123*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.signalStrengthLte.rsrq);
124*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.signalStrengthLte.rssnr,
125*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.signalStrengthLte.rssnr);
126*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.signalStrengthLte.cqi,
127*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.signalStrengthLte.cqi);
128*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.lte.signalStrengthLte.timingAdvance,
129*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.lte.signalStrengthLte.timingAdvance);
130*84e33947SAndroid Build Coastguard Worker       break;
131*84e33947SAndroid Build Coastguard Worker 
132*84e33947SAndroid Build Coastguard Worker     case CHRE_WWAN_CELL_INFO_TYPE_WCDMA:
133*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.cellIdentityWcdma.mcc,
134*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.cellIdentityWcdma.mcc);
135*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.cellIdentityWcdma.mnc,
136*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.cellIdentityWcdma.mnc);
137*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.cellIdentityWcdma.lac,
138*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.cellIdentityWcdma.lac);
139*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.cellIdentityWcdma.cid,
140*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.cellIdentityWcdma.cid);
141*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.cellIdentityWcdma.psc,
142*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.cellIdentityWcdma.psc);
143*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.cellIdentityWcdma.uarfcn,
144*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.cellIdentityWcdma.uarfcn);
145*84e33947SAndroid Build Coastguard Worker 
146*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.signalStrengthWcdma.signalStrength,
147*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.signalStrengthWcdma.signalStrength);
148*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chpp->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate,
149*84e33947SAndroid Build Coastguard Worker                 chre->CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
150*84e33947SAndroid Build Coastguard Worker       break;
151*84e33947SAndroid Build Coastguard Worker 
152*84e33947SAndroid Build Coastguard Worker     default:
153*84e33947SAndroid Build Coastguard Worker       // Other types not supported yet
154*84e33947SAndroid Build Coastguard Worker       ASSERT_TRUE(false);
155*84e33947SAndroid Build Coastguard Worker   }
156*84e33947SAndroid Build Coastguard Worker }
157*84e33947SAndroid Build Coastguard Worker 
158*84e33947SAndroid Build Coastguard Worker //! Test for correct handling of a malformed ChppWwanCellInfoResult (e.g. short
159*84e33947SAndroid Build Coastguard Worker //! payload, invalid offset/length)
testMalformedCellInfoResultDecoding(struct ChppWwanCellInfoResult * chpp,size_t inputSize)160*84e33947SAndroid Build Coastguard Worker void testMalformedCellInfoResultDecoding(struct ChppWwanCellInfoResult *chpp,
161*84e33947SAndroid Build Coastguard Worker                                          size_t inputSize) {
162*84e33947SAndroid Build Coastguard Worker   chreWwanCellInfoResult *chreMalformed;
163*84e33947SAndroid Build Coastguard Worker 
164*84e33947SAndroid Build Coastguard Worker   inputSize--;
165*84e33947SAndroid Build Coastguard Worker   chreMalformed = chppWwanCellInfoResultToChre(chpp, inputSize);
166*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreMalformed, nullptr);
167*84e33947SAndroid Build Coastguard Worker   inputSize++;
168*84e33947SAndroid Build Coastguard Worker 
169*84e33947SAndroid Build Coastguard Worker   chpp->cells.offset++;
170*84e33947SAndroid Build Coastguard Worker   chreMalformed = chppWwanCellInfoResultToChre(chpp, inputSize);
171*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreMalformed, nullptr);
172*84e33947SAndroid Build Coastguard Worker   chpp->cells.offset--;
173*84e33947SAndroid Build Coastguard Worker 
174*84e33947SAndroid Build Coastguard Worker   chpp->cells.length++;
175*84e33947SAndroid Build Coastguard Worker   chreMalformed = chppWwanCellInfoResultToChre(chpp, inputSize);
176*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreMalformed, nullptr);
177*84e33947SAndroid Build Coastguard Worker   chpp->cells.length--;
178*84e33947SAndroid Build Coastguard Worker 
179*84e33947SAndroid Build Coastguard Worker   chpp->cellInfoCount++;
180*84e33947SAndroid Build Coastguard Worker   chreMalformed = chppWwanCellInfoResultToChre(chpp, inputSize);
181*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreMalformed, nullptr);
182*84e33947SAndroid Build Coastguard Worker   chpp->cellInfoCount--;
183*84e33947SAndroid Build Coastguard Worker 
184*84e33947SAndroid Build Coastguard Worker   chpp->cellInfoCount--;
185*84e33947SAndroid Build Coastguard Worker   chreMalformed = chppWwanCellInfoResultToChre(chpp, inputSize);
186*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chreMalformed, nullptr);
187*84e33947SAndroid Build Coastguard Worker   chpp->cellInfoCount++;
188*84e33947SAndroid Build Coastguard Worker }
189*84e33947SAndroid Build Coastguard Worker 
TEST(WwanConvert,EncodeErrorCode)190*84e33947SAndroid Build Coastguard Worker TEST(WwanConvert, EncodeErrorCode) {
191*84e33947SAndroid Build Coastguard Worker   const chreWwanCellInfoResult chreResult = {
192*84e33947SAndroid Build Coastguard Worker       .version = 200,  // ignored
193*84e33947SAndroid Build Coastguard Worker       .errorCode = 2,
194*84e33947SAndroid Build Coastguard Worker       .cellInfoCount = 0,
195*84e33947SAndroid Build Coastguard Worker       .reserved = 3,         // ignored
196*84e33947SAndroid Build Coastguard Worker       .cookie = (void *)-1,  // ignored
197*84e33947SAndroid Build Coastguard Worker       .cells = nullptr,
198*84e33947SAndroid Build Coastguard Worker   };
199*84e33947SAndroid Build Coastguard Worker 
200*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResultWithHeader *chppWithHeader = nullptr;
201*84e33947SAndroid Build Coastguard Worker   size_t outputSize = 999;
202*84e33947SAndroid Build Coastguard Worker   bool result =
203*84e33947SAndroid Build Coastguard Worker       chppWwanCellInfoResultFromChre(&chreResult, &chppWithHeader, &outputSize);
204*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(result);
205*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chppWithHeader, nullptr);
206*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(outputSize, sizeof(ChppWwanCellInfoResultWithHeader));
207*84e33947SAndroid Build Coastguard Worker 
208*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResult *chpp = &chppWithHeader->payload;
209*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->version, CHRE_WWAN_CELL_INFO_RESULT_VERSION);
210*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->errorCode, chreResult.errorCode);
211*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cellInfoCount, chreResult.cellInfoCount);
212*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->reserved, 0);
213*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cookie, 0u);
214*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cells.offset, 0);
215*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cells.length, 0);
216*84e33947SAndroid Build Coastguard Worker 
217*84e33947SAndroid Build Coastguard Worker   chppFree(chppWithHeader);
218*84e33947SAndroid Build Coastguard Worker }
219*84e33947SAndroid Build Coastguard Worker 
TEST(WwanConvert,DecodeErrorCode)220*84e33947SAndroid Build Coastguard Worker TEST(WwanConvert, DecodeErrorCode) {
221*84e33947SAndroid Build Coastguard Worker   const ChppWwanCellInfoResult chpp = {
222*84e33947SAndroid Build Coastguard Worker       .version = 200,  // ignored
223*84e33947SAndroid Build Coastguard Worker       .errorCode = 2,
224*84e33947SAndroid Build Coastguard Worker       .cellInfoCount = 0,
225*84e33947SAndroid Build Coastguard Worker       .reserved = 3,  // ignored
226*84e33947SAndroid Build Coastguard Worker       .cookie = 100,  // ignored
227*84e33947SAndroid Build Coastguard Worker       .cells.offset = 0,
228*84e33947SAndroid Build Coastguard Worker       .cells.length = 0,
229*84e33947SAndroid Build Coastguard Worker   };
230*84e33947SAndroid Build Coastguard Worker 
231*84e33947SAndroid Build Coastguard Worker   size_t outputSize = sizeof(struct ChppWwanCellInfoResult);
232*84e33947SAndroid Build Coastguard Worker   chreWwanCellInfoResult *chre =
233*84e33947SAndroid Build Coastguard Worker       chppWwanCellInfoResultToChre(&chpp, outputSize);
234*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chre, nullptr);
235*84e33947SAndroid Build Coastguard Worker 
236*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->version, CHRE_WWAN_CELL_INFO_RESULT_VERSION);
237*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->errorCode, chpp.errorCode);
238*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cellInfoCount, chpp.cellInfoCount);
239*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->reserved, 0);
240*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cookie, (void *)0);
241*84e33947SAndroid Build Coastguard Worker 
242*84e33947SAndroid Build Coastguard Worker   // Handling of short payload
243*84e33947SAndroid Build Coastguard Worker   chreWwanCellInfoResult *chreShort =
244*84e33947SAndroid Build Coastguard Worker       chppWwanCellInfoResultToChre(&chpp, outputSize - 1);
245*84e33947SAndroid Build Coastguard Worker   ASSERT_EQ(chreShort, nullptr);
246*84e33947SAndroid Build Coastguard Worker 
247*84e33947SAndroid Build Coastguard Worker   chppFree(chre);
248*84e33947SAndroid Build Coastguard Worker }
249*84e33947SAndroid Build Coastguard Worker 
TEST(WwanConvert,EncodeOneCell)250*84e33947SAndroid Build Coastguard Worker TEST(WwanConvert, EncodeOneCell) {
251*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResultWithHeader *chppWithHeader = nullptr;
252*84e33947SAndroid Build Coastguard Worker   size_t outputSize = 999;
253*84e33947SAndroid Build Coastguard Worker   bool result = chppWwanCellInfoResultFromChre(&kChreResultOneCell,
254*84e33947SAndroid Build Coastguard Worker                                                &chppWithHeader, &outputSize);
255*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(result);
256*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chppWithHeader, nullptr);
257*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(outputSize, sizeof(ChppWwanCellInfoResultWithHeader) +
258*84e33947SAndroid Build Coastguard Worker                             sizeof(ChppWwanCellInfo));
259*84e33947SAndroid Build Coastguard Worker 
260*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResult *chpp = &chppWithHeader->payload;
261*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->errorCode, kChreResultOneCell.errorCode);
262*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cellInfoCount, kChreResultOneCell.cellInfoCount);
263*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cells.offset, sizeof(ChppWwanCellInfoResult));
264*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cells.length, sizeof(ChppWwanCellInfo));
265*84e33947SAndroid Build Coastguard Worker 
266*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfo *chppCell =
267*84e33947SAndroid Build Coastguard Worker       (ChppWwanCellInfo *)((uint8_t *)chpp + chpp->cells.offset);
268*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCell->reserved, 0);
269*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&kChreCells[0], chppCell);
270*84e33947SAndroid Build Coastguard Worker 
271*84e33947SAndroid Build Coastguard Worker   chppFree(chppWithHeader);
272*84e33947SAndroid Build Coastguard Worker }
273*84e33947SAndroid Build Coastguard Worker 
TEST(WwanConvert,EncodeDecodeOneCell)274*84e33947SAndroid Build Coastguard Worker TEST(WwanConvert, EncodeDecodeOneCell) {
275*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResultWithHeader *chppWithHeader;
276*84e33947SAndroid Build Coastguard Worker   size_t outputSize;
277*84e33947SAndroid Build Coastguard Worker   bool result = chppWwanCellInfoResultFromChre(&kChreResultOneCell,
278*84e33947SAndroid Build Coastguard Worker                                                &chppWithHeader, &outputSize);
279*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(result);
280*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chppWithHeader, nullptr);
281*84e33947SAndroid Build Coastguard Worker 
282*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResult *chpp = &chppWithHeader->payload;
283*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfo *chppCell =
284*84e33947SAndroid Build Coastguard Worker       (ChppWwanCellInfo *)((uint8_t *)chpp + chpp->cells.offset);
285*84e33947SAndroid Build Coastguard Worker 
286*84e33947SAndroid Build Coastguard Worker   chpp->version = 100;  // ignored
287*84e33947SAndroid Build Coastguard Worker   chpp->reserved = 10;  // ignored
288*84e33947SAndroid Build Coastguard Worker   chpp->cookie = -10;   // ignored
289*84e33947SAndroid Build Coastguard Worker 
290*84e33947SAndroid Build Coastguard Worker   size_t inputSize = outputSize - sizeof(struct ChppAppHeader);
291*84e33947SAndroid Build Coastguard Worker 
292*84e33947SAndroid Build Coastguard Worker   chreWwanCellInfoResult *chre = chppWwanCellInfoResultToChre(chpp, inputSize);
293*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chre, nullptr);
294*84e33947SAndroid Build Coastguard Worker 
295*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->version, CHRE_WWAN_CELL_INFO_RESULT_VERSION);
296*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->reserved, 0);
297*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cookie, (void *)0);
298*84e33947SAndroid Build Coastguard Worker 
299*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->errorCode, chpp->errorCode);
300*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->errorCode, kChreResultOneCell.errorCode);
301*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cellInfoCount, chpp->cellInfoCount);
302*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cellInfoCount, kChreResultOneCell.cellInfoCount);
303*84e33947SAndroid Build Coastguard Worker 
304*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cells[0].reserved, 0);
305*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&kChreCells[0], chppCell);
306*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&chre->cells[0], chppCell);
307*84e33947SAndroid Build Coastguard Worker 
308*84e33947SAndroid Build Coastguard Worker   testMalformedCellInfoResultDecoding(chpp, inputSize);
309*84e33947SAndroid Build Coastguard Worker 
310*84e33947SAndroid Build Coastguard Worker   chppFree(chppWithHeader);
311*84e33947SAndroid Build Coastguard Worker   chppFree(chre);
312*84e33947SAndroid Build Coastguard Worker }
313*84e33947SAndroid Build Coastguard Worker 
TEST(WwanConvert,EncodeTwoCells)314*84e33947SAndroid Build Coastguard Worker TEST(WwanConvert, EncodeTwoCells) {
315*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResultWithHeader *chppWithHeader = nullptr;
316*84e33947SAndroid Build Coastguard Worker   size_t outputSize = 999;
317*84e33947SAndroid Build Coastguard Worker   bool result = chppWwanCellInfoResultFromChre(&kChreResultTwoCell,
318*84e33947SAndroid Build Coastguard Worker                                                &chppWithHeader, &outputSize);
319*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(result);
320*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chppWithHeader, nullptr);
321*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(outputSize, sizeof(ChppWwanCellInfoResultWithHeader) +
322*84e33947SAndroid Build Coastguard Worker                             2 * sizeof(ChppWwanCellInfo));
323*84e33947SAndroid Build Coastguard Worker 
324*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResult *chpp = &chppWithHeader->payload;
325*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->errorCode, kChreResultTwoCell.errorCode);
326*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cellInfoCount, kChreResultTwoCell.cellInfoCount);
327*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cells.offset, sizeof(ChppWwanCellInfoResult));
328*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cells.length, 2 * sizeof(ChppWwanCellInfo));
329*84e33947SAndroid Build Coastguard Worker 
330*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfo *chppCells =
331*84e33947SAndroid Build Coastguard Worker       (ChppWwanCellInfo *)((uint8_t *)chpp + chpp->cells.offset);
332*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCells[0].reserved, 0);
333*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCells[1].reserved, 0);
334*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&kChreCells[0], &chppCells[0]);
335*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&kChreCells[1], &chppCells[1]);
336*84e33947SAndroid Build Coastguard Worker 
337*84e33947SAndroid Build Coastguard Worker   // Ensure unused bytes in the union are zeroed out
338*84e33947SAndroid Build Coastguard Worker   uint8_t *pastEnd =
339*84e33947SAndroid Build Coastguard Worker       (uint8_t *)&chppCells[1].CellInfo.wcdma.signalStrengthWcdma.bitErrorRate +
340*84e33947SAndroid Build Coastguard Worker       sizeof(chppCells[1].CellInfo.wcdma.signalStrengthWcdma.bitErrorRate);
341*84e33947SAndroid Build Coastguard Worker   size_t sizePastEnd = sizeof(chreWwanCellInfo::chreWwanCellInfoPerRat) -
342*84e33947SAndroid Build Coastguard Worker                        sizeof(chreWwanCellInfoWcdma);
343*84e33947SAndroid Build Coastguard Worker   uint8_t zeros[sizePastEnd];
344*84e33947SAndroid Build Coastguard Worker   memset(zeros, 0, sizePastEnd);
345*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(memcmp(pastEnd, zeros, sizeof(zeros)), 0);
346*84e33947SAndroid Build Coastguard Worker 
347*84e33947SAndroid Build Coastguard Worker   chppFree(chppWithHeader);
348*84e33947SAndroid Build Coastguard Worker }
349*84e33947SAndroid Build Coastguard Worker 
TEST(WwanConvert,EncodeDecodeTwoCells)350*84e33947SAndroid Build Coastguard Worker TEST(WwanConvert, EncodeDecodeTwoCells) {
351*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResultWithHeader *chppWithHeader;
352*84e33947SAndroid Build Coastguard Worker   size_t outputSize;
353*84e33947SAndroid Build Coastguard Worker   bool result = chppWwanCellInfoResultFromChre(&kChreResultTwoCell,
354*84e33947SAndroid Build Coastguard Worker                                                &chppWithHeader, &outputSize);
355*84e33947SAndroid Build Coastguard Worker   ASSERT_TRUE(result);
356*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chppWithHeader, nullptr);
357*84e33947SAndroid Build Coastguard Worker 
358*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfoResult *chpp = &chppWithHeader->payload;
359*84e33947SAndroid Build Coastguard Worker   ChppWwanCellInfo *chppCells =
360*84e33947SAndroid Build Coastguard Worker       (ChppWwanCellInfo *)((uint8_t *)chpp + chpp->cells.offset);
361*84e33947SAndroid Build Coastguard Worker 
362*84e33947SAndroid Build Coastguard Worker   chpp->version = 100;  // ignored
363*84e33947SAndroid Build Coastguard Worker   chpp->reserved = 10;  // ignored
364*84e33947SAndroid Build Coastguard Worker   chpp->cookie = -10;   // ignored
365*84e33947SAndroid Build Coastguard Worker 
366*84e33947SAndroid Build Coastguard Worker   size_t inputSize = outputSize - sizeof(struct ChppAppHeader);
367*84e33947SAndroid Build Coastguard Worker 
368*84e33947SAndroid Build Coastguard Worker   chreWwanCellInfoResult *chre = chppWwanCellInfoResultToChre(chpp, inputSize);
369*84e33947SAndroid Build Coastguard Worker   ASSERT_NE(chre, nullptr);
370*84e33947SAndroid Build Coastguard Worker 
371*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->version, CHRE_WWAN_CELL_INFO_RESULT_VERSION);
372*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->reserved, 0);
373*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cookie, (void *)0);
374*84e33947SAndroid Build Coastguard Worker 
375*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->errorCode, chpp->errorCode);
376*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->errorCode, kChreResultTwoCell.errorCode);
377*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cellInfoCount, chpp->cellInfoCount);
378*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chpp->cellInfoCount, kChreResultTwoCell.cellInfoCount);
379*84e33947SAndroid Build Coastguard Worker 
380*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cells[0].reserved, 0);
381*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&kChreCells[0], &chppCells[0]);
382*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&chre->cells[0], &chppCells[0]);
383*84e33947SAndroid Build Coastguard Worker 
384*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chre->cells[1].reserved, 0);
385*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&kChreCells[1], &chppCells[1]);
386*84e33947SAndroid Build Coastguard Worker   compareCellInfo(&chre->cells[1], &chppCells[1]);
387*84e33947SAndroid Build Coastguard Worker 
388*84e33947SAndroid Build Coastguard Worker   testMalformedCellInfoResultDecoding(chpp, inputSize);
389*84e33947SAndroid Build Coastguard Worker 
390*84e33947SAndroid Build Coastguard Worker   chppFree(chppWithHeader);
391*84e33947SAndroid Build Coastguard Worker   chppFree(chre);
392*84e33947SAndroid Build Coastguard Worker }
393*84e33947SAndroid Build Coastguard Worker 
394*84e33947SAndroid Build Coastguard Worker }  // namespace
395