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