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