xref: /aosp_15_r20/system/chre/chpp/test/transport_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 "transport_test.h"
18*84e33947SAndroid Build Coastguard Worker 
19*84e33947SAndroid Build Coastguard Worker #include <gtest/gtest.h>
20*84e33947SAndroid Build Coastguard Worker 
21*84e33947SAndroid Build Coastguard Worker #include <stdbool.h>
22*84e33947SAndroid Build Coastguard Worker #include <stddef.h>
23*84e33947SAndroid Build Coastguard Worker #include <stdint.h>
24*84e33947SAndroid Build Coastguard Worker #include <string.h>
25*84e33947SAndroid Build Coastguard Worker #include <chrono>
26*84e33947SAndroid Build Coastguard Worker #include <thread>
27*84e33947SAndroid Build Coastguard Worker 
28*84e33947SAndroid Build Coastguard Worker #include "chpp/app.h"
29*84e33947SAndroid Build Coastguard Worker #include "chpp/common/discovery.h"
30*84e33947SAndroid Build Coastguard Worker #include "chpp/common/gnss.h"
31*84e33947SAndroid Build Coastguard Worker #include "chpp/common/gnss_types.h"
32*84e33947SAndroid Build Coastguard Worker #include "chpp/common/standard_uuids.h"
33*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wifi.h"
34*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wifi_types.h"
35*84e33947SAndroid Build Coastguard Worker #include "chpp/common/wwan.h"
36*84e33947SAndroid Build Coastguard Worker #include "chpp/crc.h"
37*84e33947SAndroid Build Coastguard Worker #include "chpp/macros.h"
38*84e33947SAndroid Build Coastguard Worker #include "chpp/memory.h"
39*84e33947SAndroid Build Coastguard Worker #include "chpp/platform/platform_link.h"
40*84e33947SAndroid Build Coastguard Worker #include "chpp/platform/utils.h"
41*84e33947SAndroid Build Coastguard Worker #include "chpp/services/discovery.h"
42*84e33947SAndroid Build Coastguard Worker #include "chpp/services/loopback.h"
43*84e33947SAndroid Build Coastguard Worker #include "chpp/transport.h"
44*84e33947SAndroid Build Coastguard Worker #include "chre/pal/wwan.h"
45*84e33947SAndroid Build Coastguard Worker 
46*84e33947SAndroid Build Coastguard Worker namespace chpp::test {
47*84e33947SAndroid Build Coastguard Worker 
48*84e33947SAndroid Build Coastguard Worker namespace {
49*84e33947SAndroid Build Coastguard Worker 
50*84e33947SAndroid Build Coastguard Worker // Max size of payload sent to chppRxDataCb (bytes)
51*84e33947SAndroid Build Coastguard Worker constexpr size_t kMaxChunkSize = 20000;
52*84e33947SAndroid Build Coastguard Worker 
53*84e33947SAndroid Build Coastguard Worker constexpr size_t kMaxPacketSize =
54*84e33947SAndroid Build Coastguard Worker     kMaxChunkSize + CHPP_TRANSPORT_ENCODING_OVERHEAD_BYTES;
55*84e33947SAndroid Build Coastguard Worker 
56*84e33947SAndroid Build Coastguard Worker // Input sizes to test the entire range of sizes with a few tests
57*84e33947SAndroid Build Coastguard Worker constexpr int kChunkSizes[] = {0, 1, 2, 3, 4, 21, 100, 1000, 10001, 20000};
58*84e33947SAndroid Build Coastguard Worker 
59*84e33947SAndroid Build Coastguard Worker // Number of services
60*84e33947SAndroid Build Coastguard Worker constexpr int kServiceCount = CHPP_EXPECTED_SERVICE_COUNT;
61*84e33947SAndroid Build Coastguard Worker 
62*84e33947SAndroid Build Coastguard Worker // State of the link layer.
63*84e33947SAndroid Build Coastguard Worker struct ChppLinuxLinkState gChppLinuxLinkContext;
64*84e33947SAndroid Build Coastguard Worker 
65*84e33947SAndroid Build Coastguard Worker }  // namespace
66*84e33947SAndroid Build Coastguard Worker 
67*84e33947SAndroid Build Coastguard Worker /*
68*84e33947SAndroid Build Coastguard Worker  * Test suite for the CHPP Transport Layer
69*84e33947SAndroid Build Coastguard Worker  */
70*84e33947SAndroid Build Coastguard Worker class TransportTests : public testing::TestWithParam<int> {
71*84e33947SAndroid Build Coastguard Worker  protected:
SetUp()72*84e33947SAndroid Build Coastguard Worker   void SetUp() override {
73*84e33947SAndroid Build Coastguard Worker     chppClearTotalAllocBytes();
74*84e33947SAndroid Build Coastguard Worker     memset(&gChppLinuxLinkContext, 0, sizeof(struct ChppLinuxLinkState));
75*84e33947SAndroid Build Coastguard Worker     gChppLinuxLinkContext.manualSendCycle = true;
76*84e33947SAndroid Build Coastguard Worker     gChppLinuxLinkContext.linkEstablished = true;
77*84e33947SAndroid Build Coastguard Worker     gChppLinuxLinkContext.isLinkActive = true;
78*84e33947SAndroid Build Coastguard Worker     const struct ChppLinkApi *linkApi = getLinuxLinkApi();
79*84e33947SAndroid Build Coastguard Worker     chppTransportInit(&mTransportContext, &mAppContext, &gChppLinuxLinkContext,
80*84e33947SAndroid Build Coastguard Worker                       linkApi);
81*84e33947SAndroid Build Coastguard Worker     chppAppInit(&mAppContext, &mTransportContext);
82*84e33947SAndroid Build Coastguard Worker 
83*84e33947SAndroid Build Coastguard Worker     mTransportContext.resetState = CHPP_RESET_STATE_NONE;
84*84e33947SAndroid Build Coastguard Worker 
85*84e33947SAndroid Build Coastguard Worker     // Make sure CHPP has a correct count of the number of registered services
86*84e33947SAndroid Build Coastguard Worker     // on this platform as registered in the function
87*84e33947SAndroid Build Coastguard Worker     // chppRegisterCommonServices().
88*84e33947SAndroid Build Coastguard Worker     ASSERT_EQ(mAppContext.registeredServiceCount, kServiceCount);
89*84e33947SAndroid Build Coastguard Worker   }
90*84e33947SAndroid Build Coastguard Worker 
TearDown()91*84e33947SAndroid Build Coastguard Worker   void TearDown() override {
92*84e33947SAndroid Build Coastguard Worker     chppAppDeinit(&mAppContext);
93*84e33947SAndroid Build Coastguard Worker     chppTransportDeinit(&mTransportContext);
94*84e33947SAndroid Build Coastguard Worker 
95*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(chppGetTotalAllocBytes(), 0);
96*84e33947SAndroid Build Coastguard Worker   }
97*84e33947SAndroid Build Coastguard Worker 
98*84e33947SAndroid Build Coastguard Worker   ChppTransportState mTransportContext = {};
99*84e33947SAndroid Build Coastguard Worker   ChppAppState mAppContext = {};
100*84e33947SAndroid Build Coastguard Worker   uint8_t mBuf[kMaxPacketSize] = {};
101*84e33947SAndroid Build Coastguard Worker };
102*84e33947SAndroid Build Coastguard Worker 
103*84e33947SAndroid Build Coastguard Worker /**
104*84e33947SAndroid Build Coastguard Worker  * A series of zeros shouldn't change state from CHPP_STATE_PREAMBLE
105*84e33947SAndroid Build Coastguard Worker  */
TEST_P(TransportTests,ZeroNoPreambleInput)106*84e33947SAndroid Build Coastguard Worker TEST_P(TransportTests, ZeroNoPreambleInput) {
107*84e33947SAndroid Build Coastguard Worker   size_t len = static_cast<size_t>(GetParam());
108*84e33947SAndroid Build Coastguard Worker   if (len <= kMaxChunkSize) {
109*84e33947SAndroid Build Coastguard Worker     EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, len));
110*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
111*84e33947SAndroid Build Coastguard Worker   }
112*84e33947SAndroid Build Coastguard Worker }
113*84e33947SAndroid Build Coastguard Worker 
114*84e33947SAndroid Build Coastguard Worker /**
115*84e33947SAndroid Build Coastguard Worker  * A preamble after a series of zeros input should change state from
116*84e33947SAndroid Build Coastguard Worker  * CHPP_STATE_PREAMBLE to CHPP_STATE_HEADER
117*84e33947SAndroid Build Coastguard Worker  */
TEST_P(TransportTests,ZeroThenPreambleInput)118*84e33947SAndroid Build Coastguard Worker TEST_P(TransportTests, ZeroThenPreambleInput) {
119*84e33947SAndroid Build Coastguard Worker   size_t len = static_cast<size_t>(GetParam());
120*84e33947SAndroid Build Coastguard Worker 
121*84e33947SAndroid Build Coastguard Worker   if (len <= kMaxChunkSize) {
122*84e33947SAndroid Build Coastguard Worker     // Add preamble at the end of mBuf, as individual bytes instead of using
123*84e33947SAndroid Build Coastguard Worker     // chppAddPreamble(&mBuf[preambleLoc])
124*84e33947SAndroid Build Coastguard Worker     size_t preambleLoc = MAX(0, len - CHPP_PREAMBLE_LEN_BYTES);
125*84e33947SAndroid Build Coastguard Worker     mBuf[preambleLoc] = kChppPreamble0;
126*84e33947SAndroid Build Coastguard Worker     mBuf[preambleLoc + 1] = kChppPreamble1;
127*84e33947SAndroid Build Coastguard Worker 
128*84e33947SAndroid Build Coastguard Worker     if (len >= CHPP_PREAMBLE_LEN_BYTES) {
129*84e33947SAndroid Build Coastguard Worker       EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, len));
130*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_HEADER);
131*84e33947SAndroid Build Coastguard Worker     } else {
132*84e33947SAndroid Build Coastguard Worker       EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, len));
133*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
134*84e33947SAndroid Build Coastguard Worker     }
135*84e33947SAndroid Build Coastguard Worker   }
136*84e33947SAndroid Build Coastguard Worker }
137*84e33947SAndroid Build Coastguard Worker 
138*84e33947SAndroid Build Coastguard Worker /**
139*84e33947SAndroid Build Coastguard Worker  * Rx Testing with various length payloads of zeros
140*84e33947SAndroid Build Coastguard Worker  */
TEST_P(TransportTests,RxPayloadOfZeros)141*84e33947SAndroid Build Coastguard Worker TEST_P(TransportTests, RxPayloadOfZeros) {
142*84e33947SAndroid Build Coastguard Worker   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
143*84e33947SAndroid Build Coastguard Worker   size_t len = static_cast<size_t>(GetParam());
144*84e33947SAndroid Build Coastguard Worker   bool isLenValid = (len <= chppTransportRxMtuSize(&mTransportContext));
145*84e33947SAndroid Build Coastguard Worker 
146*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
147*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
148*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
149*84e33947SAndroid Build Coastguard Worker 
150*84e33947SAndroid Build Coastguard Worker   if (len <= kMaxChunkSize) {
151*84e33947SAndroid Build Coastguard Worker     size_t loc = 0;
152*84e33947SAndroid Build Coastguard Worker     addPreambleToBuf(mBuf, &loc);
153*84e33947SAndroid Build Coastguard Worker     ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
154*84e33947SAndroid Build Coastguard Worker 
155*84e33947SAndroid Build Coastguard Worker     transHeader->length = static_cast<uint16_t>(len);
156*84e33947SAndroid Build Coastguard Worker     loc += len;
157*84e33947SAndroid Build Coastguard Worker 
158*84e33947SAndroid Build Coastguard Worker     addTransportFooterToBuf(mBuf, &loc);
159*84e33947SAndroid Build Coastguard Worker 
160*84e33947SAndroid Build Coastguard Worker     // Send header and check for correct state
161*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(
162*84e33947SAndroid Build Coastguard Worker         chppRxDataCb(&mTransportContext, mBuf,
163*84e33947SAndroid Build Coastguard Worker                      CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)),
164*84e33947SAndroid Build Coastguard Worker         !isLenValid);
165*84e33947SAndroid Build Coastguard Worker 
166*84e33947SAndroid Build Coastguard Worker     if (!isLenValid) {
167*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
168*84e33947SAndroid Build Coastguard Worker     } else if (len > 0) {
169*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PAYLOAD);
170*84e33947SAndroid Build Coastguard Worker     } else {
171*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_FOOTER);
172*84e33947SAndroid Build Coastguard Worker     }
173*84e33947SAndroid Build Coastguard Worker 
174*84e33947SAndroid Build Coastguard Worker     // Correct decoding of packet length
175*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxHeader.length, len);
176*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
177*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxDatagram.length, isLenValid ? len : 0);
178*84e33947SAndroid Build Coastguard Worker 
179*84e33947SAndroid Build Coastguard Worker     // Send payload if any and check for correct state
180*84e33947SAndroid Build Coastguard Worker     if (len > 0) {
181*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(
182*84e33947SAndroid Build Coastguard Worker           chppRxDataCb(
183*84e33947SAndroid Build Coastguard Worker               &mTransportContext,
184*84e33947SAndroid Build Coastguard Worker               &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)],
185*84e33947SAndroid Build Coastguard Worker               len),
186*84e33947SAndroid Build Coastguard Worker           !isLenValid);
187*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.rxStatus.state,
188*84e33947SAndroid Build Coastguard Worker                 isLenValid ? CHPP_STATE_FOOTER : CHPP_STATE_PREAMBLE);
189*84e33947SAndroid Build Coastguard Worker     }
190*84e33947SAndroid Build Coastguard Worker 
191*84e33947SAndroid Build Coastguard Worker     // Should have complete packet payload by now
192*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, isLenValid ? len : 0);
193*84e33947SAndroid Build Coastguard Worker 
194*84e33947SAndroid Build Coastguard Worker     // But no ACK yet
195*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, transHeader->seq);
196*84e33947SAndroid Build Coastguard Worker 
197*84e33947SAndroid Build Coastguard Worker     // Send footer
198*84e33947SAndroid Build Coastguard Worker     EXPECT_TRUE(chppRxDataCb(
199*84e33947SAndroid Build Coastguard Worker         &mTransportContext,
200*84e33947SAndroid Build Coastguard Worker         &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) + len],
201*84e33947SAndroid Build Coastguard Worker         sizeof(ChppTransportFooter)));
202*84e33947SAndroid Build Coastguard Worker 
203*84e33947SAndroid Build Coastguard Worker     // The next expected packet sequence # should incremented only if the
204*84e33947SAndroid Build Coastguard Worker     // received packet is payload-bearing.
205*84e33947SAndroid Build Coastguard Worker     uint8_t nextSeq = transHeader->seq + ((isLenValid && len > 0) ? 1 : 0);
206*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, nextSeq);
207*84e33947SAndroid Build Coastguard Worker 
208*84e33947SAndroid Build Coastguard Worker     // Check for correct ACK crafting if applicable (i.e. if the received packet
209*84e33947SAndroid Build Coastguard Worker     // is payload-bearing).
210*84e33947SAndroid Build Coastguard Worker     if (isLenValid && len > 0) {
211*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.txStatus.packetCodeToSend,
212*84e33947SAndroid Build Coastguard Worker                 CHPP_TRANSPORT_ERROR_NONE);
213*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.txDatagramQueue.pending, 0);
214*84e33947SAndroid Build Coastguard Worker 
215*84e33947SAndroid Build Coastguard Worker       WaitForTransport(&mTransportContext);
216*84e33947SAndroid Build Coastguard Worker 
217*84e33947SAndroid Build Coastguard Worker       // Check response packet fields
218*84e33947SAndroid Build Coastguard Worker       struct ChppTransportHeader *txHeader =
219*84e33947SAndroid Build Coastguard Worker           (struct ChppTransportHeader *)&gChppLinuxLinkContext
220*84e33947SAndroid Build Coastguard Worker               .buf[CHPP_PREAMBLE_LEN_BYTES];
221*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(txHeader->flags, CHPP_TRANSPORT_FLAG_FINISHED_DATAGRAM);
222*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(txHeader->packetCode, CHPP_TRANSPORT_ERROR_NONE);
223*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(txHeader->ackSeq, nextSeq);
224*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(txHeader->length, 0);
225*84e33947SAndroid Build Coastguard Worker 
226*84e33947SAndroid Build Coastguard Worker       // Check outgoing packet length
227*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.linkBufferSize,
228*84e33947SAndroid Build Coastguard Worker                 CHPP_PREAMBLE_LEN_BYTES + sizeof(struct ChppTransportHeader) +
229*84e33947SAndroid Build Coastguard Worker                     sizeof(struct ChppTransportFooter));
230*84e33947SAndroid Build Coastguard Worker     }
231*84e33947SAndroid Build Coastguard Worker 
232*84e33947SAndroid Build Coastguard Worker     // Check for correct state
233*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
234*84e33947SAndroid Build Coastguard Worker 
235*84e33947SAndroid Build Coastguard Worker     // Should have reset loc and length for next packet / datagram
236*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
237*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.rxDatagram.length, 0);
238*84e33947SAndroid Build Coastguard Worker   }
239*84e33947SAndroid Build Coastguard Worker 
240*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
241*84e33947SAndroid Build Coastguard Worker   t1.join();
242*84e33947SAndroid Build Coastguard Worker }
243*84e33947SAndroid Build Coastguard Worker 
244*84e33947SAndroid Build Coastguard Worker /**
245*84e33947SAndroid Build Coastguard Worker  * End of Packet Link Notification during preamble
246*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,LinkSendDonePreamble)247*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, LinkSendDonePreamble) {
248*84e33947SAndroid Build Coastguard Worker   size_t payloadLen = 1000;
249*84e33947SAndroid Build Coastguard Worker   size_t partLenPreamble = CHPP_PREAMBLE_LEN_BYTES - 1;
250*84e33947SAndroid Build Coastguard Worker 
251*84e33947SAndroid Build Coastguard Worker   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
252*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
253*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
254*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
255*84e33947SAndroid Build Coastguard Worker 
256*84e33947SAndroid Build Coastguard Worker   size_t loc = 0;
257*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &loc);
258*84e33947SAndroid Build Coastguard Worker   ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
259*84e33947SAndroid Build Coastguard Worker   transHeader->length = static_cast<uint16_t>(payloadLen);
260*84e33947SAndroid Build Coastguard Worker   loc += payloadLen;
261*84e33947SAndroid Build Coastguard Worker   addTransportFooterToBuf(mBuf, &loc);
262*84e33947SAndroid Build Coastguard Worker 
263*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenPreamble));
264*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
265*84e33947SAndroid Build Coastguard Worker   endAndValidatePacket(&mTransportContext);
266*84e33947SAndroid Build Coastguard Worker 
267*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
268*84e33947SAndroid Build Coastguard Worker   t1.join();
269*84e33947SAndroid Build Coastguard Worker }
270*84e33947SAndroid Build Coastguard Worker 
271*84e33947SAndroid Build Coastguard Worker /**
272*84e33947SAndroid Build Coastguard Worker  * End of Packet Link Notification during header
273*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,LinkSendDoneHeader)274*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, LinkSendDoneHeader) {
275*84e33947SAndroid Build Coastguard Worker   size_t payloadLen = 1000;
276*84e33947SAndroid Build Coastguard Worker   size_t partLenHeader =
277*84e33947SAndroid Build Coastguard Worker       CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) - 1;
278*84e33947SAndroid Build Coastguard Worker 
279*84e33947SAndroid Build Coastguard Worker   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
280*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
281*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
282*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
283*84e33947SAndroid Build Coastguard Worker 
284*84e33947SAndroid Build Coastguard Worker   size_t loc = 0;
285*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &loc);
286*84e33947SAndroid Build Coastguard Worker   ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
287*84e33947SAndroid Build Coastguard Worker   transHeader->length = static_cast<uint16_t>(payloadLen);
288*84e33947SAndroid Build Coastguard Worker   loc += payloadLen;
289*84e33947SAndroid Build Coastguard Worker   addTransportFooterToBuf(mBuf, &loc);
290*84e33947SAndroid Build Coastguard Worker 
291*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenHeader));
292*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_HEADER);
293*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxHeader.length, payloadLen);
294*84e33947SAndroid Build Coastguard Worker   endAndValidatePacket(&mTransportContext);
295*84e33947SAndroid Build Coastguard Worker 
296*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
297*84e33947SAndroid Build Coastguard Worker   t1.join();
298*84e33947SAndroid Build Coastguard Worker }
299*84e33947SAndroid Build Coastguard Worker 
300*84e33947SAndroid Build Coastguard Worker /**
301*84e33947SAndroid Build Coastguard Worker  * End of Packet Link Notification during payload
302*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,LinkSendDonePayload)303*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, LinkSendDonePayload) {
304*84e33947SAndroid Build Coastguard Worker   size_t payloadLen = 1000;
305*84e33947SAndroid Build Coastguard Worker   size_t partLenPayload = 500;
306*84e33947SAndroid Build Coastguard Worker 
307*84e33947SAndroid Build Coastguard Worker   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
308*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
309*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
310*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
311*84e33947SAndroid Build Coastguard Worker 
312*84e33947SAndroid Build Coastguard Worker   size_t loc = 0;
313*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &loc);
314*84e33947SAndroid Build Coastguard Worker   ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
315*84e33947SAndroid Build Coastguard Worker   transHeader->length = static_cast<uint16_t>(payloadLen);
316*84e33947SAndroid Build Coastguard Worker   loc += payloadLen;
317*84e33947SAndroid Build Coastguard Worker   addTransportFooterToBuf(mBuf, &loc);
318*84e33947SAndroid Build Coastguard Worker 
319*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenPayload));
320*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PAYLOAD);
321*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxHeader.length, payloadLen);
322*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(
323*84e33947SAndroid Build Coastguard Worker       mTransportContext.rxStatus.locInDatagram,
324*84e33947SAndroid Build Coastguard Worker       partLenPayload - CHPP_PREAMBLE_LEN_BYTES - sizeof(ChppTransportHeader));
325*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxDatagram.length, payloadLen);
326*84e33947SAndroid Build Coastguard Worker   endAndValidatePacket(&mTransportContext);
327*84e33947SAndroid Build Coastguard Worker 
328*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
329*84e33947SAndroid Build Coastguard Worker   t1.join();
330*84e33947SAndroid Build Coastguard Worker }
331*84e33947SAndroid Build Coastguard Worker 
332*84e33947SAndroid Build Coastguard Worker /**
333*84e33947SAndroid Build Coastguard Worker  * End of Packet Link Notification during footer
334*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,LinkSendDoneFooter)335*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, LinkSendDoneFooter) {
336*84e33947SAndroid Build Coastguard Worker   size_t payloadLen = 1000;
337*84e33947SAndroid Build Coastguard Worker   size_t partLenFooter = CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
338*84e33947SAndroid Build Coastguard Worker                          payloadLen + sizeof(ChppTransportFooter) - 1;
339*84e33947SAndroid Build Coastguard Worker 
340*84e33947SAndroid Build Coastguard Worker   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
341*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
342*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
343*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
344*84e33947SAndroid Build Coastguard Worker 
345*84e33947SAndroid Build Coastguard Worker   size_t loc = 0;
346*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &loc);
347*84e33947SAndroid Build Coastguard Worker   ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
348*84e33947SAndroid Build Coastguard Worker   transHeader->length = static_cast<uint16_t>(payloadLen);
349*84e33947SAndroid Build Coastguard Worker   loc += payloadLen;
350*84e33947SAndroid Build Coastguard Worker   addTransportFooterToBuf(mBuf, &loc);
351*84e33947SAndroid Build Coastguard Worker 
352*84e33947SAndroid Build Coastguard Worker   EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenFooter));
353*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_FOOTER);
354*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxHeader.length, payloadLen);
355*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, payloadLen);
356*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxDatagram.length, payloadLen);
357*84e33947SAndroid Build Coastguard Worker   endAndValidatePacket(&mTransportContext);
358*84e33947SAndroid Build Coastguard Worker 
359*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
360*84e33947SAndroid Build Coastguard Worker   t1.join();
361*84e33947SAndroid Build Coastguard Worker }
362*84e33947SAndroid Build Coastguard Worker 
TEST_P(TransportTests,EnqueueDatagrams)363*84e33947SAndroid Build Coastguard Worker TEST_P(TransportTests, EnqueueDatagrams) {
364*84e33947SAndroid Build Coastguard Worker   size_t len = static_cast<size_t>(GetParam());
365*84e33947SAndroid Build Coastguard Worker 
366*84e33947SAndroid Build Coastguard Worker   if (len <= CHPP_TX_DATAGRAM_QUEUE_LEN) {
367*84e33947SAndroid Build Coastguard Worker     // Add (len) datagrams of various length to queue
368*84e33947SAndroid Build Coastguard Worker 
369*84e33947SAndroid Build Coastguard Worker     int fr = 0;
370*84e33947SAndroid Build Coastguard Worker 
371*84e33947SAndroid Build Coastguard Worker     for (int j = 0; j == CHPP_TX_DATAGRAM_QUEUE_LEN; j++) {
372*84e33947SAndroid Build Coastguard Worker       for (size_t i = 1; i <= len; i++) {
373*84e33947SAndroid Build Coastguard Worker         uint8_t *mBuf = (uint8_t *)chppMalloc(i + 100);
374*84e33947SAndroid Build Coastguard Worker         EXPECT_TRUE(
375*84e33947SAndroid Build Coastguard Worker             chppEnqueueTxDatagramOrFail(&mTransportContext, mBuf, i + 100));
376*84e33947SAndroid Build Coastguard Worker 
377*84e33947SAndroid Build Coastguard Worker         EXPECT_EQ(mTransportContext.txDatagramQueue.pending, i);
378*84e33947SAndroid Build Coastguard Worker         EXPECT_EQ(mTransportContext.txDatagramQueue.front, fr);
379*84e33947SAndroid Build Coastguard Worker         EXPECT_EQ(mTransportContext.txDatagramQueue
380*84e33947SAndroid Build Coastguard Worker                       .datagram[(i - 1 + fr) % CHPP_TX_DATAGRAM_QUEUE_LEN]
381*84e33947SAndroid Build Coastguard Worker                       .length,
382*84e33947SAndroid Build Coastguard Worker                   i + 100);
383*84e33947SAndroid Build Coastguard Worker       }
384*84e33947SAndroid Build Coastguard Worker 
385*84e33947SAndroid Build Coastguard Worker       if (mTransportContext.txDatagramQueue.pending ==
386*84e33947SAndroid Build Coastguard Worker           CHPP_TX_DATAGRAM_QUEUE_LEN) {
387*84e33947SAndroid Build Coastguard Worker         uint8_t *mBuf = (uint8_t *)chppMalloc(100);
388*84e33947SAndroid Build Coastguard Worker         EXPECT_FALSE(
389*84e33947SAndroid Build Coastguard Worker             chppEnqueueTxDatagramOrFail(&mTransportContext, mBuf, 100));
390*84e33947SAndroid Build Coastguard Worker         CHPP_FREE_AND_NULLIFY(mBuf);
391*84e33947SAndroid Build Coastguard Worker       }
392*84e33947SAndroid Build Coastguard Worker 
393*84e33947SAndroid Build Coastguard Worker       for (size_t i = len; i > 0; i--) {
394*84e33947SAndroid Build Coastguard Worker         fr++;
395*84e33947SAndroid Build Coastguard Worker         fr %= CHPP_TX_DATAGRAM_QUEUE_LEN;
396*84e33947SAndroid Build Coastguard Worker 
397*84e33947SAndroid Build Coastguard Worker         EXPECT_TRUE(chppDequeueTxDatagram(&mTransportContext));
398*84e33947SAndroid Build Coastguard Worker 
399*84e33947SAndroid Build Coastguard Worker         EXPECT_EQ(mTransportContext.txDatagramQueue.front, fr);
400*84e33947SAndroid Build Coastguard Worker         EXPECT_EQ(mTransportContext.txDatagramQueue.pending, i - 1);
401*84e33947SAndroid Build Coastguard Worker       }
402*84e33947SAndroid Build Coastguard Worker 
403*84e33947SAndroid Build Coastguard Worker       EXPECT_FALSE(chppDequeueTxDatagram(&mTransportContext));
404*84e33947SAndroid Build Coastguard Worker 
405*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.txDatagramQueue.front, fr);
406*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(mTransportContext.txDatagramQueue.pending, 0);
407*84e33947SAndroid Build Coastguard Worker     }
408*84e33947SAndroid Build Coastguard Worker   }
409*84e33947SAndroid Build Coastguard Worker }
410*84e33947SAndroid Build Coastguard Worker 
411*84e33947SAndroid Build Coastguard Worker /**
412*84e33947SAndroid Build Coastguard Worker  * Loopback testing with various length payloads of zeros
413*84e33947SAndroid Build Coastguard Worker  */
TEST_P(TransportTests,LoopbackPayloadOfZeros)414*84e33947SAndroid Build Coastguard Worker TEST_P(TransportTests, LoopbackPayloadOfZeros) {
415*84e33947SAndroid Build Coastguard Worker   mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
416*84e33947SAndroid Build Coastguard Worker   size_t len = static_cast<size_t>(GetParam());
417*84e33947SAndroid Build Coastguard Worker 
418*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
419*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
420*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
421*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
422*84e33947SAndroid Build Coastguard Worker   t1.join();
423*84e33947SAndroid Build Coastguard Worker 
424*84e33947SAndroid Build Coastguard Worker   if (len > 1 && len <= kMaxChunkSize) {
425*84e33947SAndroid Build Coastguard Worker     // Loopback App header (only 2 fields required)
426*84e33947SAndroid Build Coastguard Worker     mBuf[0] = CHPP_HANDLE_LOOPBACK;
427*84e33947SAndroid Build Coastguard Worker     mBuf[1] = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
428*84e33947SAndroid Build Coastguard Worker 
429*84e33947SAndroid Build Coastguard Worker     EXPECT_TRUE(chppDispatchLoopbackClientRequest(&mAppContext, mBuf, len));
430*84e33947SAndroid Build Coastguard Worker 
431*84e33947SAndroid Build Coastguard Worker     uint16_t end = (mTransportContext.txDatagramQueue.front +
432*84e33947SAndroid Build Coastguard Worker                     mTransportContext.txDatagramQueue.pending - 1) %
433*84e33947SAndroid Build Coastguard Worker                    CHPP_TX_DATAGRAM_QUEUE_LEN;
434*84e33947SAndroid Build Coastguard Worker 
435*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.txDatagramQueue.datagram[end].length, len);
436*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.txDatagramQueue.datagram[end].payload[0],
437*84e33947SAndroid Build Coastguard Worker               CHPP_HANDLE_LOOPBACK);
438*84e33947SAndroid Build Coastguard Worker     EXPECT_EQ(mTransportContext.txDatagramQueue.datagram[end].payload[1],
439*84e33947SAndroid Build Coastguard Worker               CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
440*84e33947SAndroid Build Coastguard Worker   }
441*84e33947SAndroid Build Coastguard Worker }
442*84e33947SAndroid Build Coastguard Worker 
443*84e33947SAndroid Build Coastguard Worker /**
444*84e33947SAndroid Build Coastguard Worker  * Discovery service + Transaction ID
445*84e33947SAndroid Build Coastguard Worker  */
TEST_P(TransportTests,DiscoveryAndTransactionID)446*84e33947SAndroid Build Coastguard Worker TEST_P(TransportTests, DiscoveryAndTransactionID) {
447*84e33947SAndroid Build Coastguard Worker   uint8_t transactionID = static_cast<uint8_t>(GetParam());
448*84e33947SAndroid Build Coastguard Worker   size_t len = 0;
449*84e33947SAndroid Build Coastguard Worker 
450*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
451*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
452*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
453*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
454*84e33947SAndroid Build Coastguard Worker   t1.join();
455*84e33947SAndroid Build Coastguard Worker 
456*84e33947SAndroid Build Coastguard Worker   ChppAppHeader *appHeader = addAppHeaderToBuf(mBuf, &len);
457*84e33947SAndroid Build Coastguard Worker   appHeader->handle = CHPP_HANDLE_DISCOVERY;
458*84e33947SAndroid Build Coastguard Worker   appHeader->transaction = transactionID;
459*84e33947SAndroid Build Coastguard Worker   appHeader->command = CHPP_DISCOVERY_COMMAND_DISCOVER_ALL;
460*84e33947SAndroid Build Coastguard Worker 
461*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(chppDispatchDiscoveryClientRequest(&mAppContext, mBuf, len));
462*84e33947SAndroid Build Coastguard Worker 
463*84e33947SAndroid Build Coastguard Worker   uint16_t end = (mTransportContext.txDatagramQueue.front +
464*84e33947SAndroid Build Coastguard Worker                   mTransportContext.txDatagramQueue.pending - 1) %
465*84e33947SAndroid Build Coastguard Worker                  CHPP_TX_DATAGRAM_QUEUE_LEN;
466*84e33947SAndroid Build Coastguard Worker 
467*84e33947SAndroid Build Coastguard Worker   struct ChppAppHeader *responseHeader =
468*84e33947SAndroid Build Coastguard Worker       (ChppAppHeader *)mTransportContext.txDatagramQueue.datagram[end].payload;
469*84e33947SAndroid Build Coastguard Worker 
470*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseHeader->handle, CHPP_HANDLE_DISCOVERY);
471*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseHeader->type, CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
472*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseHeader->transaction, transactionID);
473*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseHeader->error, CHPP_APP_ERROR_NONE);
474*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseHeader->command, CHPP_DISCOVERY_COMMAND_DISCOVER_ALL);
475*84e33947SAndroid Build Coastguard Worker 
476*84e33947SAndroid Build Coastguard Worker   // Decode discovery response
477*84e33947SAndroid Build Coastguard Worker   ChppServiceDescriptor *services =
478*84e33947SAndroid Build Coastguard Worker       (ChppServiceDescriptor *)&mTransportContext.txDatagramQueue.datagram[end]
479*84e33947SAndroid Build Coastguard Worker           .payload[sizeof(ChppAppHeader)];
480*84e33947SAndroid Build Coastguard Worker 
481*84e33947SAndroid Build Coastguard Worker   // Check total length (and implicit service count)
482*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(
483*84e33947SAndroid Build Coastguard Worker       mTransportContext.txDatagramQueue.datagram[end].length,
484*84e33947SAndroid Build Coastguard Worker       sizeof(ChppAppHeader) + kServiceCount * sizeof(ChppServiceDescriptor));
485*84e33947SAndroid Build Coastguard Worker 
486*84e33947SAndroid Build Coastguard Worker   // Check service configuration response
487*84e33947SAndroid Build Coastguard Worker   ChppServiceDescriptor wwanServiceDescriptor = {};
488*84e33947SAndroid Build Coastguard Worker   static const uint8_t uuid[CHPP_SERVICE_UUID_LEN] = CHPP_UUID_WWAN_STANDARD;
489*84e33947SAndroid Build Coastguard Worker   memcpy(&wwanServiceDescriptor.uuid, &uuid,
490*84e33947SAndroid Build Coastguard Worker          sizeof(wwanServiceDescriptor.uuid));
491*84e33947SAndroid Build Coastguard Worker   static const char name[CHPP_SERVICE_NAME_MAX_LEN] = "WWAN";
492*84e33947SAndroid Build Coastguard Worker   memcpy(&wwanServiceDescriptor.name, &name,
493*84e33947SAndroid Build Coastguard Worker          sizeof(wwanServiceDescriptor.name));
494*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.major = 1;
495*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.minor = 0;
496*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.patch = 0;
497*84e33947SAndroid Build Coastguard Worker 
498*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(std::memcmp(services[0].uuid, wwanServiceDescriptor.uuid,
499*84e33947SAndroid Build Coastguard Worker                         sizeof(wwanServiceDescriptor.uuid)),
500*84e33947SAndroid Build Coastguard Worker             0);
501*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(std::memcmp(services[0].name, wwanServiceDescriptor.name,
502*84e33947SAndroid Build Coastguard Worker                         sizeof(wwanServiceDescriptor.name)),
503*84e33947SAndroid Build Coastguard Worker             0);
504*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(services[0].version.major, wwanServiceDescriptor.version.major);
505*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(services[0].version.minor, wwanServiceDescriptor.version.minor);
506*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(services[0].version.patch, wwanServiceDescriptor.version.patch);
507*84e33947SAndroid Build Coastguard Worker }
508*84e33947SAndroid Build Coastguard Worker 
509*84e33947SAndroid Build Coastguard Worker /**
510*84e33947SAndroid Build Coastguard Worker  * CRC-32 calculation for several pre-known test vectors.
511*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,CRC32Basic)512*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, CRC32Basic) {
513*84e33947SAndroid Build Coastguard Worker   static const char kTest1Str[] = "Hello World Test!";
514*84e33947SAndroid Build Coastguard Worker   static const uint8_t *kTest1 = (const uint8_t *)kTest1Str;
515*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest1, 17), 0x613B1D74);
516*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest1, 16), 0x5F88D7D9);
517*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest1, 1), 0xAA05262F);
518*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest1, 0), 0x00000000);
519*84e33947SAndroid Build Coastguard Worker 
520*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest2[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
521*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 6), 0x41D9ED00);
522*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 5), 0xD2FD1072);
523*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 4), 0xFFFFFFFF);
524*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 3), 0xFFFFFF00);
525*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 2), 0xFFFF0000);
526*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 1), 0xFF000000);
527*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest2, 0), 0x00000000);
528*84e33947SAndroid Build Coastguard Worker 
529*84e33947SAndroid Build Coastguard Worker   static const char kTest3Str[] = "123456789";
530*84e33947SAndroid Build Coastguard Worker   static const uint8_t *kTest3 = (const uint8_t *)kTest3Str;
531*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest3, 9), 0xCBF43926);
532*84e33947SAndroid Build Coastguard Worker 
533*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest4[] = {0x00, 0x00, 0x00, 0x00};
534*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest4, sizeof(kTest4)), 0x2144DF1C);
535*84e33947SAndroid Build Coastguard Worker 
536*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest5[] = {0xF2, 0x01, 0x83};
537*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest5, sizeof(kTest5)), 0x24AB9D77);
538*84e33947SAndroid Build Coastguard Worker 
539*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest6[] = {0x0F, 0xAA, 0x00, 0x55};
540*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest6, sizeof(kTest6)), 0xB6C9B287);
541*84e33947SAndroid Build Coastguard Worker 
542*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest7[] = {0x00, 0xFF, 0x55, 0x11};
543*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest7, sizeof(kTest7)), 0x32A06212);
544*84e33947SAndroid Build Coastguard Worker 
545*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest8[] = {0x33, 0x22, 0x55, 0xAA, 0xBB,
546*84e33947SAndroid Build Coastguard Worker                                    0xCC, 0xDD, 0xEE, 0xFF};
547*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest8, sizeof(kTest8)), 0xB0AE863D);
548*84e33947SAndroid Build Coastguard Worker 
549*84e33947SAndroid Build Coastguard Worker   static const uint8_t kTest9[] = {0x92, 0x6B, 0x55};
550*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(chppCrc32(0, kTest9, sizeof(kTest9)), 0x9CDEA29B);
551*84e33947SAndroid Build Coastguard Worker }
552*84e33947SAndroid Build Coastguard Worker 
553*84e33947SAndroid Build Coastguard Worker /**
554*84e33947SAndroid Build Coastguard Worker  * CRC-32 calculation for daisy-chained input.
555*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,CRC32DaisyChained)556*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, CRC32DaisyChained) {
557*84e33947SAndroid Build Coastguard Worker   static const size_t kMaxLen = 10000;
558*84e33947SAndroid Build Coastguard Worker   uint8_t test[kMaxLen];
559*84e33947SAndroid Build Coastguard Worker   // Populate test with 8-bit LFSR
560*84e33947SAndroid Build Coastguard Worker   // Feedback polynomial is x^8 + x^6 + x^5 + x^4 + 1
561*84e33947SAndroid Build Coastguard Worker   static uint8_t lfsr = 1;
562*84e33947SAndroid Build Coastguard Worker   for (size_t i = 0; i < kMaxLen; i++) {
563*84e33947SAndroid Build Coastguard Worker     test[i] = lfsr;
564*84e33947SAndroid Build Coastguard Worker     lfsr = (lfsr >> 1) |
565*84e33947SAndroid Build Coastguard Worker            (((lfsr << 7) ^ (lfsr << 5) ^ (lfsr << 4) ^ (lfsr << 3)) & 0x80);
566*84e33947SAndroid Build Coastguard Worker   }
567*84e33947SAndroid Build Coastguard Worker 
568*84e33947SAndroid Build Coastguard Worker   for (size_t len = 0; len < kMaxLen; len += 1000) {
569*84e33947SAndroid Build Coastguard Worker     uint32_t fullCRC = chppCrc32(0, &test[0], len);
570*84e33947SAndroid Build Coastguard Worker     for (size_t partition = 0; partition <= len; partition++) {
571*84e33947SAndroid Build Coastguard Worker       uint32_t partialCRC = chppCrc32(0, &test[0], partition);
572*84e33947SAndroid Build Coastguard Worker       EXPECT_EQ(chppCrc32(partialCRC, &test[partition], len - partition),
573*84e33947SAndroid Build Coastguard Worker                 fullCRC);
574*84e33947SAndroid Build Coastguard Worker     }
575*84e33947SAndroid Build Coastguard Worker   }
576*84e33947SAndroid Build Coastguard Worker }
577*84e33947SAndroid Build Coastguard Worker 
578*84e33947SAndroid Build Coastguard Worker /**
579*84e33947SAndroid Build Coastguard Worker  * WWAN service Open and GetCapabilities.
580*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,WwanOpen)581*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, WwanOpen) {
582*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
583*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
584*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
585*84e33947SAndroid Build Coastguard Worker 
586*84e33947SAndroid Build Coastguard Worker   uint8_t ackSeq = 1;
587*84e33947SAndroid Build Coastguard Worker   uint8_t seq = 0;
588*84e33947SAndroid Build Coastguard Worker   uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START;
589*84e33947SAndroid Build Coastguard Worker   uint8_t transactionID = 0;
590*84e33947SAndroid Build Coastguard Worker   size_t len = 0;
591*84e33947SAndroid Build Coastguard Worker 
592*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(findServiceHandle(&mAppContext, "WWAN", &handle), true);
593*84e33947SAndroid Build Coastguard Worker 
594*84e33947SAndroid Build Coastguard Worker   openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
595*84e33947SAndroid Build Coastguard Worker               transactionID++, CHPP_WWAN_OPEN, gChppLinuxLinkContext);
596*84e33947SAndroid Build Coastguard Worker 
597*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &len);
598*84e33947SAndroid Build Coastguard Worker 
599*84e33947SAndroid Build Coastguard Worker   uint16_t command = CHPP_WWAN_GET_CAPABILITIES;
600*84e33947SAndroid Build Coastguard Worker   sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
601*84e33947SAndroid Build Coastguard Worker                        transactionID++, command, gChppLinuxLinkContext);
602*84e33947SAndroid Build Coastguard Worker 
603*84e33947SAndroid Build Coastguard Worker   size_t responseLoc = sizeof(ChppTestResponse);
604*84e33947SAndroid Build Coastguard Worker 
605*84e33947SAndroid Build Coastguard Worker   // Validate capabilities
606*84e33947SAndroid Build Coastguard Worker   uint32_t *capabilities = (uint32_t *)&gChppLinuxLinkContext.buf[responseLoc];
607*84e33947SAndroid Build Coastguard Worker   responseLoc += sizeof(uint32_t);
608*84e33947SAndroid Build Coastguard Worker 
609*84e33947SAndroid Build Coastguard Worker   // Cleanup
610*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
611*84e33947SAndroid Build Coastguard Worker   t1.join();
612*84e33947SAndroid Build Coastguard Worker 
613*84e33947SAndroid Build Coastguard Worker   uint32_t capabilitySet = CHRE_WWAN_GET_CELL_INFO;
614*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
615*84e33947SAndroid Build Coastguard Worker 
616*84e33947SAndroid Build Coastguard Worker   // Check total length
617*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
618*84e33947SAndroid Build Coastguard Worker                              sizeof(ChppWwanGetCapabilitiesResponse));
619*84e33947SAndroid Build Coastguard Worker }
620*84e33947SAndroid Build Coastguard Worker 
621*84e33947SAndroid Build Coastguard Worker /**
622*84e33947SAndroid Build Coastguard Worker  * WiFi service Open and GetCapabilities.
623*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,WifiOpen)624*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, WifiOpen) {
625*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
626*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
627*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
628*84e33947SAndroid Build Coastguard Worker 
629*84e33947SAndroid Build Coastguard Worker   uint8_t ackSeq = 1;
630*84e33947SAndroid Build Coastguard Worker   uint8_t seq = 0;
631*84e33947SAndroid Build Coastguard Worker   uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 1;
632*84e33947SAndroid Build Coastguard Worker   uint8_t transactionID = 0;
633*84e33947SAndroid Build Coastguard Worker 
634*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(findServiceHandle(&mAppContext, "WiFi", &handle), true);
635*84e33947SAndroid Build Coastguard Worker 
636*84e33947SAndroid Build Coastguard Worker   openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
637*84e33947SAndroid Build Coastguard Worker               transactionID++, CHPP_WIFI_OPEN, gChppLinuxLinkContext);
638*84e33947SAndroid Build Coastguard Worker 
639*84e33947SAndroid Build Coastguard Worker   uint16_t command = CHPP_WIFI_GET_CAPABILITIES;
640*84e33947SAndroid Build Coastguard Worker   sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
641*84e33947SAndroid Build Coastguard Worker                        transactionID++, command, gChppLinuxLinkContext);
642*84e33947SAndroid Build Coastguard Worker 
643*84e33947SAndroid Build Coastguard Worker   size_t responseLoc = sizeof(ChppTestResponse);
644*84e33947SAndroid Build Coastguard Worker 
645*84e33947SAndroid Build Coastguard Worker   // Cleanup
646*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
647*84e33947SAndroid Build Coastguard Worker   t1.join();
648*84e33947SAndroid Build Coastguard Worker 
649*84e33947SAndroid Build Coastguard Worker   // Validate capabilities
650*84e33947SAndroid Build Coastguard Worker   uint32_t *capabilities = (uint32_t *)&gChppLinuxLinkContext.buf[responseLoc];
651*84e33947SAndroid Build Coastguard Worker   responseLoc += sizeof(uint32_t);
652*84e33947SAndroid Build Coastguard Worker 
653*84e33947SAndroid Build Coastguard Worker   uint32_t capabilitySet = CHRE_WIFI_CAPABILITIES_SCAN_MONITORING |
654*84e33947SAndroid Build Coastguard Worker                            CHRE_WIFI_CAPABILITIES_ON_DEMAND_SCAN |
655*84e33947SAndroid Build Coastguard Worker                            CHRE_WIFI_CAPABILITIES_RADIO_CHAIN_PREF |
656*84e33947SAndroid Build Coastguard Worker                            CHRE_WIFI_CAPABILITIES_RTT_RANGING |
657*84e33947SAndroid Build Coastguard Worker                            CHRE_WIFI_CAPABILITIES_NAN_SUB;
658*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
659*84e33947SAndroid Build Coastguard Worker 
660*84e33947SAndroid Build Coastguard Worker   // Check total length
661*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
662*84e33947SAndroid Build Coastguard Worker                              sizeof(ChppWwanGetCapabilitiesResponse));
663*84e33947SAndroid Build Coastguard Worker }
664*84e33947SAndroid Build Coastguard Worker 
665*84e33947SAndroid Build Coastguard Worker /**
666*84e33947SAndroid Build Coastguard Worker  * GNSS service Open and GetCapabilities.
667*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,GnssOpen)668*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, GnssOpen) {
669*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
670*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
671*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
672*84e33947SAndroid Build Coastguard Worker 
673*84e33947SAndroid Build Coastguard Worker   uint8_t ackSeq = 1;
674*84e33947SAndroid Build Coastguard Worker   uint8_t seq = 0;
675*84e33947SAndroid Build Coastguard Worker   uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 2;
676*84e33947SAndroid Build Coastguard Worker   uint8_t transactionID = 0;
677*84e33947SAndroid Build Coastguard Worker   size_t len = 0;
678*84e33947SAndroid Build Coastguard Worker 
679*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(findServiceHandle(&mAppContext, "GNSS", &handle), true);
680*84e33947SAndroid Build Coastguard Worker 
681*84e33947SAndroid Build Coastguard Worker   openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
682*84e33947SAndroid Build Coastguard Worker               transactionID++, CHPP_GNSS_OPEN, gChppLinuxLinkContext);
683*84e33947SAndroid Build Coastguard Worker 
684*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &len);
685*84e33947SAndroid Build Coastguard Worker 
686*84e33947SAndroid Build Coastguard Worker   uint16_t command = CHPP_GNSS_GET_CAPABILITIES;
687*84e33947SAndroid Build Coastguard Worker   sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
688*84e33947SAndroid Build Coastguard Worker                        transactionID++, command, gChppLinuxLinkContext);
689*84e33947SAndroid Build Coastguard Worker 
690*84e33947SAndroid Build Coastguard Worker   size_t responseLoc = sizeof(ChppTestResponse);
691*84e33947SAndroid Build Coastguard Worker 
692*84e33947SAndroid Build Coastguard Worker   // Cleanup
693*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
694*84e33947SAndroid Build Coastguard Worker   t1.join();
695*84e33947SAndroid Build Coastguard Worker 
696*84e33947SAndroid Build Coastguard Worker   // Validate capabilities
697*84e33947SAndroid Build Coastguard Worker   uint32_t *capabilities = (uint32_t *)&gChppLinuxLinkContext.buf[responseLoc];
698*84e33947SAndroid Build Coastguard Worker   responseLoc += sizeof(uint32_t);
699*84e33947SAndroid Build Coastguard Worker 
700*84e33947SAndroid Build Coastguard Worker   uint32_t capabilitySet =
701*84e33947SAndroid Build Coastguard Worker       CHRE_GNSS_CAPABILITIES_LOCATION | CHRE_GNSS_CAPABILITIES_MEASUREMENTS |
702*84e33947SAndroid Build Coastguard Worker       CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER;
703*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
704*84e33947SAndroid Build Coastguard Worker 
705*84e33947SAndroid Build Coastguard Worker   // Check total length
706*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
707*84e33947SAndroid Build Coastguard Worker                              sizeof(ChppGnssGetCapabilitiesResponse));
708*84e33947SAndroid Build Coastguard Worker }
709*84e33947SAndroid Build Coastguard Worker 
710*84e33947SAndroid Build Coastguard Worker /**
711*84e33947SAndroid Build Coastguard Worker  * Discovery client.
712*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,Discovery)713*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, Discovery) {
714*84e33947SAndroid Build Coastguard Worker   size_t len = 0;
715*84e33947SAndroid Build Coastguard Worker 
716*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
717*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
718*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
719*84e33947SAndroid Build Coastguard Worker 
720*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &len);
721*84e33947SAndroid Build Coastguard Worker 
722*84e33947SAndroid Build Coastguard Worker   ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &len);
723*84e33947SAndroid Build Coastguard Worker 
724*84e33947SAndroid Build Coastguard Worker   ChppAppHeader *appHeader = addAppHeaderToBuf(mBuf, &len);
725*84e33947SAndroid Build Coastguard Worker   appHeader->handle = CHPP_HANDLE_DISCOVERY;
726*84e33947SAndroid Build Coastguard Worker   appHeader->command = CHPP_DISCOVERY_COMMAND_DISCOVER_ALL;
727*84e33947SAndroid Build Coastguard Worker   appHeader->type = CHPP_MESSAGE_TYPE_SERVICE_RESPONSE;
728*84e33947SAndroid Build Coastguard Worker 
729*84e33947SAndroid Build Coastguard Worker   ChppServiceDescriptor wwanServiceDescriptor = {};
730*84e33947SAndroid Build Coastguard Worker   static const uint8_t uuid[CHPP_SERVICE_UUID_LEN] = CHPP_UUID_WWAN_STANDARD;
731*84e33947SAndroid Build Coastguard Worker   memcpy(&wwanServiceDescriptor.uuid, &uuid,
732*84e33947SAndroid Build Coastguard Worker          sizeof(wwanServiceDescriptor.uuid));
733*84e33947SAndroid Build Coastguard Worker   static const char name[CHPP_SERVICE_NAME_MAX_LEN] = "WWAN";
734*84e33947SAndroid Build Coastguard Worker   memcpy(&wwanServiceDescriptor.name, &name,
735*84e33947SAndroid Build Coastguard Worker          sizeof(wwanServiceDescriptor.name));
736*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.major = 1;
737*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.minor = 0;
738*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.patch = 0;
739*84e33947SAndroid Build Coastguard Worker 
740*84e33947SAndroid Build Coastguard Worker   memcpy(&mBuf[len], &wwanServiceDescriptor, sizeof(ChppServiceDescriptor));
741*84e33947SAndroid Build Coastguard Worker   len += sizeof(ChppServiceDescriptor);
742*84e33947SAndroid Build Coastguard Worker 
743*84e33947SAndroid Build Coastguard Worker   transHeader->length = static_cast<uint16_t>(
744*84e33947SAndroid Build Coastguard Worker       len - sizeof(ChppTransportHeader) - CHPP_PREAMBLE_LEN_BYTES);
745*84e33947SAndroid Build Coastguard Worker 
746*84e33947SAndroid Build Coastguard Worker   addTransportFooterToBuf(mBuf, &len);
747*84e33947SAndroid Build Coastguard Worker 
748*84e33947SAndroid Build Coastguard Worker   // Initialize clientIndexOfServiceIndex[0] to see if it correctly updated
749*84e33947SAndroid Build Coastguard Worker   // upon discovery
750*84e33947SAndroid Build Coastguard Worker   mAppContext.clientIndexOfServiceIndex[0] = CHPP_CLIENT_INDEX_NONE;
751*84e33947SAndroid Build Coastguard Worker 
752*84e33947SAndroid Build Coastguard Worker   // Send header + payload (if any) + footer
753*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, len));
754*84e33947SAndroid Build Coastguard Worker 
755*84e33947SAndroid Build Coastguard Worker   // Cleanup
756*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
757*84e33947SAndroid Build Coastguard Worker   t1.join();
758*84e33947SAndroid Build Coastguard Worker 
759*84e33947SAndroid Build Coastguard Worker   // Check for correct state
760*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mAppContext.clientIndexOfServiceIndex[0], 0);
761*84e33947SAndroid Build Coastguard Worker   uint8_t nextSeq = transHeader->seq + 1;
762*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, nextSeq);
763*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
764*84e33947SAndroid Build Coastguard Worker }
765*84e33947SAndroid Build Coastguard Worker 
766*84e33947SAndroid Build Coastguard Worker /**
767*84e33947SAndroid Build Coastguard Worker  * Unopened clients should not crash upon an unsolicitated service response.
768*84e33947SAndroid Build Coastguard Worker  */
TEST_F(TransportTests,UnopenedClient)769*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, UnopenedClient) {
770*84e33947SAndroid Build Coastguard Worker   size_t len = 0;
771*84e33947SAndroid Build Coastguard Worker   uint8_t *buf = (uint8_t *)chppMalloc(100);
772*84e33947SAndroid Build Coastguard Worker 
773*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
774*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
775*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
776*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
777*84e33947SAndroid Build Coastguard Worker   t1.join();
778*84e33947SAndroid Build Coastguard Worker 
779*84e33947SAndroid Build Coastguard Worker   ChppAppHeader *appHeader = addAppHeaderToBuf(buf, &len);
780*84e33947SAndroid Build Coastguard Worker   appHeader->handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 1;
781*84e33947SAndroid Build Coastguard Worker   appHeader->command = CHPP_WIFI_CONFIGURE_SCAN_MONITOR_ASYNC;
782*84e33947SAndroid Build Coastguard Worker   appHeader->type = CHPP_MESSAGE_TYPE_SERVICE_RESPONSE;
783*84e33947SAndroid Build Coastguard Worker   len = sizeof(struct ChppWifiConfigureScanMonitorAsyncResponse);
784*84e33947SAndroid Build Coastguard Worker 
785*84e33947SAndroid Build Coastguard Worker   ASSERT_EQ(mAppContext.registeredServiceCount, kServiceCount);
786*84e33947SAndroid Build Coastguard Worker 
787*84e33947SAndroid Build Coastguard Worker   chppAppProcessRxDatagram(&mAppContext, buf, len);
788*84e33947SAndroid Build Coastguard Worker 
789*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.txStatus.packetCodeToSend,
790*84e33947SAndroid Build Coastguard Worker             CHPP_TRANSPORT_ERROR_APPLAYER);
791*84e33947SAndroid Build Coastguard Worker }
792*84e33947SAndroid Build Coastguard Worker 
TEST_F(TransportTests,DiscardedPacketTest)793*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, DiscardedPacketTest) {
794*84e33947SAndroid Build Coastguard Worker   mTransportContext.txStatus.hasPacketsToSend = true;
795*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, &mTransportContext);
796*84e33947SAndroid Build Coastguard Worker   WaitForTransport(&mTransportContext);
797*84e33947SAndroid Build Coastguard Worker 
798*84e33947SAndroid Build Coastguard Worker   // Send packet to RX thread after manually setting to resetting state.
799*84e33947SAndroid Build Coastguard Worker   // We expect this packet to get dropped, but this test checks for any
800*84e33947SAndroid Build Coastguard Worker   // problematic behavior (e.g. memory leaks).
801*84e33947SAndroid Build Coastguard Worker   mTransportContext.resetState = CHPP_RESET_STATE_RESETTING;
802*84e33947SAndroid Build Coastguard Worker 
803*84e33947SAndroid Build Coastguard Worker   size_t loc = 0;
804*84e33947SAndroid Build Coastguard Worker   addPreambleToBuf(mBuf, &loc);
805*84e33947SAndroid Build Coastguard Worker   ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
806*84e33947SAndroid Build Coastguard Worker 
807*84e33947SAndroid Build Coastguard Worker   ChppAppHeader *appHeader = addAppHeaderToBuf(mBuf, &loc);
808*84e33947SAndroid Build Coastguard Worker   appHeader->handle = CHPP_HANDLE_DISCOVERY;
809*84e33947SAndroid Build Coastguard Worker   appHeader->command = CHPP_DISCOVERY_COMMAND_DISCOVER_ALL;
810*84e33947SAndroid Build Coastguard Worker   appHeader->type = CHPP_MESSAGE_TYPE_SERVICE_RESPONSE;
811*84e33947SAndroid Build Coastguard Worker 
812*84e33947SAndroid Build Coastguard Worker   ChppServiceDescriptor wwanServiceDescriptor = {};
813*84e33947SAndroid Build Coastguard Worker   static const uint8_t uuid[CHPP_SERVICE_UUID_LEN] = CHPP_UUID_WWAN_STANDARD;
814*84e33947SAndroid Build Coastguard Worker   memcpy(&wwanServiceDescriptor.uuid, &uuid,
815*84e33947SAndroid Build Coastguard Worker          sizeof(wwanServiceDescriptor.uuid));
816*84e33947SAndroid Build Coastguard Worker   static const char name[CHPP_SERVICE_NAME_MAX_LEN] = "WWAN";
817*84e33947SAndroid Build Coastguard Worker   memcpy(&wwanServiceDescriptor.name, &name,
818*84e33947SAndroid Build Coastguard Worker          sizeof(wwanServiceDescriptor.name));
819*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.major = 1;
820*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.minor = 0;
821*84e33947SAndroid Build Coastguard Worker   wwanServiceDescriptor.version.patch = 0;
822*84e33947SAndroid Build Coastguard Worker 
823*84e33947SAndroid Build Coastguard Worker   memcpy(&mBuf[loc], &wwanServiceDescriptor, sizeof(ChppServiceDescriptor));
824*84e33947SAndroid Build Coastguard Worker   loc += sizeof(ChppServiceDescriptor);
825*84e33947SAndroid Build Coastguard Worker 
826*84e33947SAndroid Build Coastguard Worker   transHeader->length = static_cast<uint16_t>(
827*84e33947SAndroid Build Coastguard Worker       loc - sizeof(ChppTransportHeader) - CHPP_PREAMBLE_LEN_BYTES);
828*84e33947SAndroid Build Coastguard Worker 
829*84e33947SAndroid Build Coastguard Worker   addTransportFooterToBuf(mBuf, &loc);
830*84e33947SAndroid Build Coastguard Worker 
831*84e33947SAndroid Build Coastguard Worker   mAppContext.clientIndexOfServiceIndex[0] = CHPP_CLIENT_INDEX_NONE;
832*84e33947SAndroid Build Coastguard Worker 
833*84e33947SAndroid Build Coastguard Worker   EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, loc));
834*84e33947SAndroid Build Coastguard Worker 
835*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(&mTransportContext);
836*84e33947SAndroid Build Coastguard Worker   t1.join();
837*84e33947SAndroid Build Coastguard Worker }
838*84e33947SAndroid Build Coastguard Worker 
839*84e33947SAndroid Build Coastguard Worker /*
840*84e33947SAndroid Build Coastguard Worker  * Correctly handle messages directed to clients / services with an invalid
841*84e33947SAndroid Build Coastguard Worker  * handle number.
842*84e33947SAndroid Build Coastguard Worker  */
messageToInvalidHandle(ChppTransportState * transportContext,uint8_t type)843*84e33947SAndroid Build Coastguard Worker void messageToInvalidHandle(ChppTransportState *transportContext,
844*84e33947SAndroid Build Coastguard Worker                             uint8_t type) {
845*84e33947SAndroid Build Coastguard Worker   size_t len = 0;
846*84e33947SAndroid Build Coastguard Worker   uint8_t *buf = (uint8_t *)chppMalloc(100);
847*84e33947SAndroid Build Coastguard Worker 
848*84e33947SAndroid Build Coastguard Worker   transportContext->txStatus.hasPacketsToSend = true;
849*84e33947SAndroid Build Coastguard Worker   std::thread t1(chppWorkThreadStart, transportContext);
850*84e33947SAndroid Build Coastguard Worker   WaitForTransport(transportContext);
851*84e33947SAndroid Build Coastguard Worker   chppWorkThreadStop(transportContext);
852*84e33947SAndroid Build Coastguard Worker   t1.join();
853*84e33947SAndroid Build Coastguard Worker 
854*84e33947SAndroid Build Coastguard Worker   ChppAppHeader *appHeader = addAppHeaderToBuf(buf, &len);
855*84e33947SAndroid Build Coastguard Worker   appHeader->handle =
856*84e33947SAndroid Build Coastguard Worker       CHPP_HANDLE_NEGOTIATED_RANGE_START +
857*84e33947SAndroid Build Coastguard Worker       MAX(CHPP_MAX_REGISTERED_CLIENTS, CHPP_MAX_REGISTERED_SERVICES);
858*84e33947SAndroid Build Coastguard Worker   appHeader->type = type;
859*84e33947SAndroid Build Coastguard Worker   len = sizeof(struct ChppAppHeader);
860*84e33947SAndroid Build Coastguard Worker 
861*84e33947SAndroid Build Coastguard Worker   chppAppProcessRxDatagram(transportContext->appContext, buf, len);
862*84e33947SAndroid Build Coastguard Worker 
863*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(transportContext->txStatus.packetCodeToSend,
864*84e33947SAndroid Build Coastguard Worker             CHPP_TRANSPORT_ERROR_APPLAYER);
865*84e33947SAndroid Build Coastguard Worker }
866*84e33947SAndroid Build Coastguard Worker 
TEST_F(TransportTests,RequestToInvalidService)867*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, RequestToInvalidService) {
868*84e33947SAndroid Build Coastguard Worker   messageToInvalidHandle(&mTransportContext, CHPP_MESSAGE_TYPE_CLIENT_REQUEST);
869*84e33947SAndroid Build Coastguard Worker }
870*84e33947SAndroid Build Coastguard Worker 
TEST_F(TransportTests,ResponseToInvalidClient)871*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, ResponseToInvalidClient) {
872*84e33947SAndroid Build Coastguard Worker   messageToInvalidHandle(&mTransportContext,
873*84e33947SAndroid Build Coastguard Worker                          CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
874*84e33947SAndroid Build Coastguard Worker }
875*84e33947SAndroid Build Coastguard Worker 
TEST_F(TransportTests,NotificationToInvalidService)876*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, NotificationToInvalidService) {
877*84e33947SAndroid Build Coastguard Worker   messageToInvalidHandle(&mTransportContext,
878*84e33947SAndroid Build Coastguard Worker                          CHPP_MESSAGE_TYPE_CLIENT_NOTIFICATION);
879*84e33947SAndroid Build Coastguard Worker }
880*84e33947SAndroid Build Coastguard Worker 
TEST_F(TransportTests,NotificationToInvalidClient)881*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, NotificationToInvalidClient) {
882*84e33947SAndroid Build Coastguard Worker   messageToInvalidHandle(&mTransportContext,
883*84e33947SAndroid Build Coastguard Worker                          CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION);
884*84e33947SAndroid Build Coastguard Worker }
885*84e33947SAndroid Build Coastguard Worker 
TEST_F(TransportTests,WorkMonitorInvoked)886*84e33947SAndroid Build Coastguard Worker TEST_F(TransportTests, WorkMonitorInvoked) {
887*84e33947SAndroid Build Coastguard Worker   // Send message to spin work thread so it interacts with the work monitor
888*84e33947SAndroid Build Coastguard Worker   messageToInvalidHandle(&mTransportContext,
889*84e33947SAndroid Build Coastguard Worker                          CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION);
890*84e33947SAndroid Build Coastguard Worker 
891*84e33947SAndroid Build Coastguard Worker   // 1 pre/post call for executing the work and 1 for shutting down the thread.
892*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.workMonitor.numPreProcessCalls, 2);
893*84e33947SAndroid Build Coastguard Worker   EXPECT_EQ(mTransportContext.workMonitor.numPostProcessCalls, 2);
894*84e33947SAndroid Build Coastguard Worker }
895*84e33947SAndroid Build Coastguard Worker 
896*84e33947SAndroid Build Coastguard Worker INSTANTIATE_TEST_SUITE_P(TransportTestRange, TransportTests,
897*84e33947SAndroid Build Coastguard Worker                          testing::ValuesIn(kChunkSizes));
898*84e33947SAndroid Build Coastguard Worker 
899*84e33947SAndroid Build Coastguard Worker }  // namespace chpp::test
900