aboutsummaryrefslogtreecommitdiff
path: root/chpp/test/transport_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chpp/test/transport_test.cpp')
-rw-r--r--chpp/test/transport_test.cpp1093
1 files changed, 89 insertions, 1004 deletions
diff --git a/chpp/test/transport_test.cpp b/chpp/test/transport_test.cpp
index 8eb8ddee..1fcf7035 100644
--- a/chpp/test/transport_test.cpp
+++ b/chpp/test/transport_test.cpp
@@ -14,39 +14,15 @@
* limitations under the License.
*/
-#include "transport_test.h"
-
#include <gtest/gtest.h>
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
+#include <stdio.h>
#include <string.h>
-#include <thread>
-#include "chpp/app.h"
-#include "chpp/common/discovery.h"
-#include "chpp/common/gnss.h"
-#include "chpp/common/gnss_types.h"
-#include "chpp/common/standard_uuids.h"
-#include "chpp/common/wifi.h"
-#include "chpp/common/wifi_types.h"
-#include "chpp/common/wwan.h"
-#include "chpp/crc.h"
-#include "chpp/macros.h"
-#include "chpp/memory.h"
-#include "chpp/platform/utils.h"
-#include "chpp/services/discovery.h"
-#include "chpp/services/loopback.h"
#include "chpp/transport.h"
-#include "chre/pal/wwan.h"
+#include "transport_test.h"
namespace {
-// Preamble as separate bytes for testing
-constexpr uint8_t kChppPreamble0 = 0x68;
-constexpr uint8_t kChppPreamble1 = 0x43;
-
// Max size of payload sent to chppRxDataCb (bytes)
constexpr size_t kMaxChunkSize = 20000;
@@ -55,10 +31,22 @@ constexpr size_t kMaxPacketSize = kMaxChunkSize + CHPP_PREAMBLE_LEN_BYTES +
sizeof(ChppTransportFooter);
// Input sizes to test the entire range of sizes with a few tests
-constexpr int kChunkSizes[] = {0, 1, 2, 3, 4, 21, 100, 1000, 10001, 20000};
+constexpr int kChunkSizes[] = {0, 1, 2, 3, 4, 5, 6,
+ 7, 8, 10, 16, 20, 30, 40,
+ 51, 100, 201, 1000, 10001, 20000};
-// Number of services
-constexpr int kServiceCount = 3;
+/**
+ * Adds a CHPP preamble to the specified location of buf
+ *
+ * @param buf The CHPP preamble will be added to buf
+ * @param loc Location of buf where the CHPP preamble will be added
+ */
+void chppAddPreamble(uint8_t *buf, size_t loc) {
+ for (size_t i = 0; i < CHPP_PREAMBLE_LEN_BYTES; i++) {
+ buf[loc + i] = static_cast<uint8_t>(
+ CHPP_PREAMBLE_DATA >> (CHPP_PREAMBLE_LEN_BYTES - 1 - i) & 0xff);
+ }
+}
/*
* Test suite for the CHPP Transport Layer
@@ -66,304 +54,21 @@ constexpr int kServiceCount = 3;
class TransportTests : public testing::TestWithParam<int> {
protected:
void SetUp() override {
- chppClearTotalAllocBytes();
- memset(&mTransportContext.linkParams, 0,
- sizeof(mTransportContext.linkParams));
- mTransportContext.linkParams.linkEstablished = true;
- chppTransportInit(&mTransportContext, &mAppContext);
- chppAppInit(&mAppContext, &mTransportContext);
-
- mTransportContext.resetState = CHPP_RESET_STATE_NONE;
-
- // Make sure CHPP has a correct count of the number of registered services
- // on this platform, (in this case, 1,) as registered in the function
- // chppRegisterCommonServices().
- ASSERT_EQ(mAppContext.registeredServiceCount, kServiceCount);
+ chppTransportInit(&context);
}
- void TearDown() override {
- chppAppDeinit(&mAppContext);
- chppTransportDeinit(&mTransportContext);
-
- EXPECT_EQ(chppGetTotalAllocBytes(), 0);
- }
-
- ChppTransportState mTransportContext = {};
- ChppAppState mAppContext = {};
- uint8_t mBuf[kMaxPacketSize] = {};
+ ChppTransportState context = {};
+ uint8_t buf[kMaxPacketSize] = {};
};
/**
- * Wait for chppTransportDoWork() to finish after it is notified by
- * chppEnqueueTxPacket to run.
- *
- * TODO: (b/177616847) Improve test robustness / synchronization without adding
- * overhead to CHPP
- */
-void WaitForTransport(struct ChppTransportState *transportContext) {
- // Wait for linkParams.notifier.signal to be triggered and processed
- volatile uint32_t k = 1;
- while (transportContext->linkParams.notifier.signal == 0 && k > 0) {
- k++;
- }
- while (transportContext->linkParams.notifier.signal != 0 && k > 0) {
- k++;
- }
- ASSERT_FALSE(k == 0);
- while (k < UINT16_MAX) {
- k++;
- }
- while (k > 0) {
- k--;
- }
-
- // Should have reset loc and length for next packet / datagram
- EXPECT_EQ(transportContext->rxStatus.locInDatagram, 0);
- EXPECT_EQ(transportContext->rxDatagram.length, 0);
-}
-
-/**
- * Validates a ChppTestResponse. Since the error field within the
- * ChppAppHeader struct is optional (and not used for common services), this
- * function returns the error field to be checked if desired, depending on the
- * service.
- *
- * @param buf Buffer containing response.
- * @param ackSeq Ack sequence to be verified.
- * @param handle Handle number to be verified
- * @param transactionID Transaction ID to be verified.
- *
- * @return The error field within the ChppAppHeader struct that is used by some
- * but not all services.
- */
-uint8_t validateChppTestResponse(void *buf, uint8_t ackSeq, uint8_t handle,
- uint8_t transactionID) {
- struct ChppTestResponse *response = (ChppTestResponse *)buf;
-
- // Check preamble
- EXPECT_EQ(response->preamble0, kChppPreamble0);
- EXPECT_EQ(response->preamble1, kChppPreamble1);
-
- // Check response transport headers
- EXPECT_EQ(response->transportHeader.packetCode, CHPP_TRANSPORT_ERROR_NONE);
- EXPECT_EQ(response->transportHeader.ackSeq, ackSeq);
-
- // Check response app headers
- EXPECT_EQ(response->appHeader.handle, handle);
- EXPECT_EQ(response->appHeader.type, CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
- EXPECT_EQ(response->appHeader.transaction, transactionID);
-
- // Return optional response error to be checked if desired
- return response->appHeader.error;
-}
-
-/**
- * Aborts a packet and validates state.
- *
- * @param transportcontext Maintains status for each transport layer instance.
- */
-void endAndValidatePacket(struct ChppTransportState *transportContext) {
- chppRxPacketCompleteCb(transportContext);
- EXPECT_EQ(transportContext->rxStatus.state, CHPP_STATE_PREAMBLE);
- EXPECT_EQ(transportContext->rxStatus.locInDatagram, 0);
- EXPECT_EQ(transportContext->rxDatagram.length, 0);
-}
-
-/**
- * Adds a preamble to a certain location in a buffer, and increases the location
- * accordingly, to account for the length of the added preamble.
- *
- * @param buf Buffer.
- * @param location Location to add the preamble, which its value will be
- * increased accordingly.
- */
-void addPreambleToBuf(uint8_t *buf, size_t *location) {
- buf[(*location)++] = kChppPreamble0;
- buf[(*location)++] = kChppPreamble1;
-}
-
-/**
- * Adds a transport header (with default values) to a certain location in a
- * buffer, and increases the location accordingly, to account for the length of
- * the added transport header.
- *
- * @param buf Buffer.
- * @param location Location to add the transport header, which its value will be
- * increased accordingly.
- *
- * @return Pointer to the added transport header (e.g. to modify its fields).
- */
-ChppTransportHeader *addTransportHeaderToBuf(uint8_t *buf, size_t *location) {
- size_t oldLoc = *location;
-
- // Default values for initial, minimum size request packet
- ChppTransportHeader transHeader = {};
- transHeader.flags = CHPP_TRANSPORT_FLAG_FINISHED_DATAGRAM;
- transHeader.packetCode = CHPP_TRANSPORT_ERROR_NONE;
- transHeader.ackSeq = 1;
- transHeader.seq = 0;
- transHeader.length = sizeof(ChppAppHeader);
- transHeader.reserved = 0;
-
- memcpy(&buf[*location], &transHeader, sizeof(transHeader));
- *location += sizeof(transHeader);
-
- return (ChppTransportHeader *)&buf[oldLoc];
-}
-
-/**
- * Adds an app header (with default values) to a certain location in a buffer,
- * and increases the location accordingly, to account for the length of the
- * added app header.
- *
- * @param buf Buffer.
- * @param location Location to add the app header, which its value will be
- * increased accordingly.
- *
- * @return Pointer to the added app header (e.g. to modify its fields).
- */
-ChppAppHeader *addAppHeaderToBuf(uint8_t *buf, size_t *location) {
- size_t oldLoc = *location;
-
- // Default values - to be updated later as necessary
- ChppAppHeader appHeader = {};
- appHeader.handle = CHPP_HANDLE_NEGOTIATED_RANGE_START;
- appHeader.type = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
- appHeader.transaction = 0;
- appHeader.error = CHPP_APP_ERROR_NONE;
- appHeader.command = 0;
-
- memcpy(&buf[*location], &appHeader, sizeof(appHeader));
- *location += sizeof(appHeader);
-
- return (ChppAppHeader *)&buf[oldLoc];
-}
-
-/**
- * Adds a transport footer to a certain location in a buffer, and increases the
- * location accordingly, to account for the length of the added preamble.
- *
- * @param buf Buffer.
- * @param location Location to add the footer. The value of location will be
- * increased accordingly.
- *
- */
-void addTransportFooterToBuf(uint8_t *buf, size_t *location) {
- uint32_t *checksum = (uint32_t *)&buf[*location];
-
- *checksum = chppCrc32(0, &buf[CHPP_PREAMBLE_LEN_BYTES],
- *location - CHPP_PREAMBLE_LEN_BYTES);
-
- *location += sizeof(ChppTransportFooter);
-}
-
-/**
- * Opens a service and checks to make sure it was opened correctly.
- *
- * @param transportContext Transport layer context.
- * @param buf Buffer.
- * @param ackSeq Ack sequence of the packet to be sent out
- * @param seq Sequence number of the packet to be sent out.
- * @param handle Handle of the service to be opened.
- * @param transactionID Transaction ID for the open request.
- * @param command Open command.
- */
-void openService(ChppTransportState *transportContext, uint8_t *buf,
- uint8_t ackSeq, uint8_t seq, uint8_t handle,
- uint8_t transactionID, uint16_t command) {
- size_t len = 0;
-
- addPreambleToBuf(buf, &len);
-
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(buf, &len);
- transHeader->ackSeq = ackSeq;
- transHeader->seq = seq;
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(buf, &len);
- appHeader->handle = handle;
- appHeader->transaction = transactionID;
- appHeader->command = command;
-
- addTransportFooterToBuf(buf, &len);
-
- // Send header + payload (if any) + footer
- EXPECT_TRUE(chppRxDataCb(transportContext, buf, len));
-
- // Check for correct state
- uint8_t nextSeq = transHeader->seq + 1;
- EXPECT_EQ(transportContext->rxStatus.expectedSeq, nextSeq);
- EXPECT_EQ(transportContext->rxStatus.state, CHPP_STATE_PREAMBLE);
-
- // Wait for response
- WaitForTransport(transportContext);
-
- // Validate common response fields
- EXPECT_EQ(validateChppTestResponse(transportContext->pendingTxPacket.payload,
- nextSeq, handle, transactionID),
- CHPP_APP_ERROR_NONE);
-
- // Check response length
- EXPECT_EQ(sizeof(ChppTestResponse), CHPP_PREAMBLE_LEN_BYTES +
- sizeof(ChppTransportHeader) +
- sizeof(ChppAppHeader));
- EXPECT_EQ(transportContext->pendingTxPacket.length,
- sizeof(ChppTestResponse) + sizeof(ChppTransportFooter));
-}
-
-/**
- * Sends a command to a service and checks for errors.
- *
- * @param transportContext Transport layer context.
- * @param buf Buffer.
- * @param ackSeq Ack sequence of the packet to be sent out
- * @param seq Sequence number of the packet to be sent out.
- * @param handle Handle of the service to be opened.
- * @param transactionID Transaction ID for the open request.
- * @param command Command to be sent.
- */
-void sendCommandToService(ChppTransportState *transportContext, uint8_t *buf,
- uint8_t ackSeq, uint8_t seq, uint8_t handle,
- uint8_t transactionID, uint16_t command) {
- size_t len = 0;
-
- addPreambleToBuf(buf, &len);
-
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(buf, &len);
- transHeader->ackSeq = ackSeq;
- transHeader->seq = seq;
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(buf, &len);
- appHeader->handle = handle;
- appHeader->transaction = transactionID;
- appHeader->command = command;
-
- addTransportFooterToBuf(buf, &len);
-
- // Send header + payload (if any) + footer
- EXPECT_TRUE(chppRxDataCb(transportContext, buf, len));
-
- // Check for correct state
- uint8_t nextSeq = transHeader->seq + 1;
- EXPECT_EQ(transportContext->rxStatus.expectedSeq, nextSeq);
- EXPECT_EQ(transportContext->rxStatus.state, CHPP_STATE_PREAMBLE);
-
- // Wait for response
- WaitForTransport(transportContext);
-
- // Validate common response fields
- EXPECT_EQ(validateChppTestResponse(transportContext->pendingTxPacket.payload,
- nextSeq, handle, transactionID),
- CHPP_APP_ERROR_NONE);
-}
-
-/**
* A series of zeros shouldn't change state from CHPP_STATE_PREAMBLE
*/
TEST_P(TransportTests, ZeroNoPreambleInput) {
size_t len = static_cast<size_t>(GetParam());
if (len <= kMaxChunkSize) {
- EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, len));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
+ EXPECT_TRUE(chppRxDataCb(&context, buf, len));
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_PREAMBLE);
}
}
@@ -375,18 +80,15 @@ TEST_P(TransportTests, ZeroThenPreambleInput) {
size_t len = static_cast<size_t>(GetParam());
if (len <= kMaxChunkSize) {
- // Add preamble at the end of mBuf, as individual bytes instead of using
- // chppAddPreamble(&mBuf[preambleLoc])
- size_t preambleLoc = MAX(0, len - CHPP_PREAMBLE_LEN_BYTES);
- mBuf[preambleLoc] = kChppPreamble0;
- mBuf[preambleLoc + 1] = kChppPreamble1;
+ // Add preamble at the end of buf
+ chppAddPreamble(buf, MAX(0, len - CHPP_PREAMBLE_LEN_BYTES));
if (len >= CHPP_PREAMBLE_LEN_BYTES) {
- EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, len));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_HEADER);
+ EXPECT_FALSE(chppRxDataCb(&context, buf, len));
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_HEADER);
} else {
- EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, len));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
+ EXPECT_TRUE(chppRxDataCb(&context, buf, len));
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_PREAMBLE);
}
}
}
@@ -395,229 +97,84 @@ TEST_P(TransportTests, ZeroThenPreambleInput) {
* Rx Testing with various length payloads of zeros
*/
TEST_P(TransportTests, RxPayloadOfZeros) {
- mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
+ context.rxStatus.state = CHPP_STATE_HEADER;
size_t len = static_cast<size_t>(GetParam());
- bool validLen = (len <= CHPP_TRANSPORT_RX_MTU_BYTES);
-
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
if (len <= kMaxChunkSize) {
- size_t loc = 0;
- addPreambleToBuf(mBuf, &loc);
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
+ ChppTransportHeader header{};
+ header.flags = 0;
+ header.errorCode = 0;
+ header.ackSeq = 1;
+ header.seq = 0;
+ header.length = len;
- transHeader->length = static_cast<uint16_t>(len);
- loc += len;
-
- addTransportFooterToBuf(mBuf, &loc);
+ memcpy(buf, &header, sizeof(header));
// Send header and check for correct state
- EXPECT_EQ(
- chppRxDataCb(&mTransportContext, mBuf,
- CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)),
- !validLen);
-
- if (!validLen) {
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
- } else if (len > 0) {
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PAYLOAD);
+ EXPECT_FALSE(chppRxDataCb(&context, buf, sizeof(ChppTransportHeader)));
+ if (len > 0) {
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_PAYLOAD);
} else {
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_FOOTER);
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_FOOTER);
}
// Correct decoding of packet length
- EXPECT_EQ(mTransportContext.rxHeader.length, len);
- EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
- EXPECT_EQ(mTransportContext.rxDatagram.length, validLen ? len : 0);
+ EXPECT_EQ(context.rxHeader.length, len);
+ EXPECT_EQ(context.rxStatus.locInDatagram, 0);
+ EXPECT_EQ(context.rxDatagram.length, len);
// Send payload if any and check for correct state
if (len > 0) {
- EXPECT_EQ(
- chppRxDataCb(
- &mTransportContext,
- &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader)],
- len),
- !validLen);
- EXPECT_EQ(mTransportContext.rxStatus.state,
- validLen ? CHPP_STATE_FOOTER : CHPP_STATE_PREAMBLE);
+ EXPECT_FALSE(
+ chppRxDataCb(&context, &buf[sizeof(ChppTransportHeader)], len));
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_FOOTER);
}
// Should have complete packet payload by now
- EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, validLen ? len : 0);
+ EXPECT_EQ(context.rxStatus.locInDatagram, len);
// But no ACK yet
- EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, transHeader->seq);
+ EXPECT_FALSE(context.txStatus.hasPacketsToSend);
+ EXPECT_EQ(context.txStatus.errorCodeToSend, CHPP_ERROR_NONE);
+ EXPECT_EQ(context.rxStatus.expectedSeq, header.seq);
+
+ // Send footer and check for correct state
+ EXPECT_TRUE(chppRxDataCb(&context, &buf[sizeof(ChppTransportHeader) + len],
+ sizeof(ChppTransportFooter)));
+ EXPECT_EQ(context.rxStatus.state, CHPP_STATE_PREAMBLE);
- // Send footer
- EXPECT_TRUE(chppRxDataCb(
- &mTransportContext,
- &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) + len],
- sizeof(ChppTransportFooter)));
+ // Should have reset loc and length for next packet / datagram
+ EXPECT_EQ(context.rxStatus.locInDatagram, 0);
+ EXPECT_EQ(context.rxDatagram.length, 0);
- // The next expected packet sequence # should incremented only if the
- // received packet is payload-bearing.
- uint8_t nextSeq = transHeader->seq + ((validLen && len > 0) ? 1 : 0);
- EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, nextSeq);
+ // If payload packet, expect next packet with incremented sequence #
+ // Otherwise, should keep previous sequence #
+ uint8_t nextSeq = header.seq + ((len > 0) ? 1 : 0);
+ EXPECT_EQ(context.rxStatus.expectedSeq, nextSeq);
- // Check for correct ACK crafting if applicable (i.e. if the received packet
- // is payload-bearing).
- if (validLen && len > 0) {
- // TODO: Remove later as can cause flaky tests
- // These are expected to change shortly afterwards, as chppTransportDoWork
- // is run
- // EXPECT_TRUE(mTransportContext.txStatus.hasPacketsToSend);
- EXPECT_EQ(mTransportContext.txStatus.packetCodeToSend,
- CHPP_TRANSPORT_ERROR_NONE);
- EXPECT_EQ(mTransportContext.txDatagramQueue.pending, 0);
+ // Check for correct ACK crafting if applicable
+ // TODO: This will need updating once signalling goes in
+ if (len > 0) {
+ EXPECT_TRUE(context.txStatus.hasPacketsToSend);
+ EXPECT_EQ(context.txStatus.errorCodeToSend, CHPP_ERROR_NONE);
+ EXPECT_EQ(context.txDatagramQueue.pending, 0);
- WaitForTransport(&mTransportContext);
+ chppTransportDoWork(&context);
- // Check response packet fields
struct ChppTransportHeader *txHeader =
- (struct ChppTransportHeader *)&mTransportContext.pendingTxPacket
+ (struct ChppTransportHeader *)&context.packetToSend
.payload[CHPP_PREAMBLE_LEN_BYTES];
+
EXPECT_EQ(txHeader->flags, CHPP_TRANSPORT_FLAG_FINISHED_DATAGRAM);
- EXPECT_EQ(txHeader->packetCode, CHPP_TRANSPORT_ERROR_NONE);
+ EXPECT_EQ(txHeader->errorCode, CHPP_ERROR_NONE);
EXPECT_EQ(txHeader->ackSeq, nextSeq);
EXPECT_EQ(txHeader->length, 0);
- // Check outgoing packet length
- EXPECT_EQ(mTransportContext.pendingTxPacket.length,
+ EXPECT_EQ(context.packetToSend.length,
CHPP_PREAMBLE_LEN_BYTES + sizeof(struct ChppTransportHeader) +
sizeof(struct ChppTransportFooter));
}
-
- // Check for correct state
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
-
- // Should have reset loc and length for next packet / datagram
- EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, 0);
- EXPECT_EQ(mTransportContext.rxDatagram.length, 0);
}
-
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-}
-
-/**
- * End of Packet Link Notification during preamble
- */
-TEST_F(TransportTests, LinkSendDonePreamble) {
- size_t payloadLen = 1000;
- size_t partLenPreamble = CHPP_PREAMBLE_LEN_BYTES - 1;
-
- mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- size_t loc = 0;
- addPreambleToBuf(mBuf, &loc);
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
- transHeader->length = static_cast<uint16_t>(payloadLen);
- loc += payloadLen;
- addTransportFooterToBuf(mBuf, &loc);
-
- EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenPreamble));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
- endAndValidatePacket(&mTransportContext);
-
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-}
-
-/**
- * End of Packet Link Notification during header
- */
-TEST_F(TransportTests, LinkSendDoneHeader) {
- size_t payloadLen = 1000;
- size_t partLenHeader =
- CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) - 1;
-
- mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- size_t loc = 0;
- addPreambleToBuf(mBuf, &loc);
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
- transHeader->length = static_cast<uint16_t>(payloadLen);
- loc += payloadLen;
- addTransportFooterToBuf(mBuf, &loc);
-
- EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenHeader));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_HEADER);
- EXPECT_EQ(mTransportContext.rxHeader.length, payloadLen);
- endAndValidatePacket(&mTransportContext);
-
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-}
-
-/**
- * End of Packet Link Notification during payload
- */
-TEST_F(TransportTests, LinkSendDonePayload) {
- size_t payloadLen = 1000;
- size_t partLenPayload = 500;
-
- mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- size_t loc = 0;
- addPreambleToBuf(mBuf, &loc);
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
- transHeader->length = static_cast<uint16_t>(payloadLen);
- loc += payloadLen;
- addTransportFooterToBuf(mBuf, &loc);
-
- EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenPayload));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PAYLOAD);
- EXPECT_EQ(mTransportContext.rxHeader.length, payloadLen);
- EXPECT_EQ(
- mTransportContext.rxStatus.locInDatagram,
- partLenPayload - CHPP_PREAMBLE_LEN_BYTES - sizeof(ChppTransportHeader));
- EXPECT_EQ(mTransportContext.rxDatagram.length, payloadLen);
- endAndValidatePacket(&mTransportContext);
-
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-}
-
-/**
- * End of Packet Link Notification during footer
- */
-TEST_F(TransportTests, LinkSendDoneFooter) {
- size_t payloadLen = 1000;
- size_t partLenFooter = CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
- payloadLen + sizeof(ChppTransportFooter) - 1;
-
- mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- size_t loc = 0;
- addPreambleToBuf(mBuf, &loc);
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
- transHeader->length = static_cast<uint16_t>(payloadLen);
- loc += payloadLen;
- addTransportFooterToBuf(mBuf, &loc);
-
- EXPECT_FALSE(chppRxDataCb(&mTransportContext, mBuf, partLenFooter));
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_FOOTER);
- EXPECT_EQ(mTransportContext.rxHeader.length, payloadLen);
- EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, payloadLen);
- EXPECT_EQ(mTransportContext.rxDatagram.length, payloadLen);
- endAndValidatePacket(&mTransportContext);
-
- chppWorkThreadStop(&mTransportContext);
- t1.join();
}
TEST_P(TransportTests, EnqueueDatagrams) {
@@ -630,514 +187,42 @@ TEST_P(TransportTests, EnqueueDatagrams) {
for (int j = 0; j == CHPP_TX_DATAGRAM_QUEUE_LEN; j++) {
for (size_t i = 1; i <= len; i++) {
- uint8_t *mBuf = (uint8_t *)chppMalloc(i + 100);
- EXPECT_TRUE(
- chppEnqueueTxDatagramOrFail(&mTransportContext, mBuf, i + 100));
+ uint8_t *buf = (uint8_t *)chppMalloc(i + 100);
+ EXPECT_TRUE(chppEnqueueTxDatagram(&context, i + 100, buf));
- EXPECT_EQ(mTransportContext.txDatagramQueue.pending, i);
- EXPECT_EQ(mTransportContext.txDatagramQueue.front, fr);
- EXPECT_EQ(mTransportContext.txDatagramQueue
+ EXPECT_EQ(context.txDatagramQueue.pending, i);
+ EXPECT_EQ(context.txDatagramQueue.front, fr);
+ EXPECT_EQ(context.txDatagramQueue
.datagram[(i - 1 + fr) % CHPP_TX_DATAGRAM_QUEUE_LEN]
.length,
i + 100);
}
- if (mTransportContext.txDatagramQueue.pending ==
- CHPP_TX_DATAGRAM_QUEUE_LEN) {
- uint8_t *mBuf = (uint8_t *)chppMalloc(100);
- EXPECT_FALSE(
- chppEnqueueTxDatagramOrFail(&mTransportContext, mBuf, 100));
- CHPP_FREE_AND_NULLIFY(mBuf);
+ if (context.txDatagramQueue.pending == CHPP_TX_DATAGRAM_QUEUE_LEN) {
+ uint8_t *buf = (uint8_t *)chppMalloc(100);
+ EXPECT_FALSE(chppEnqueueTxDatagram(&context, 100, buf));
+ chppFree(buf);
}
for (size_t i = len; i > 0; i--) {
fr++;
fr %= CHPP_TX_DATAGRAM_QUEUE_LEN;
- EXPECT_TRUE(chppDequeueTxDatagram(&mTransportContext));
+ EXPECT_TRUE(chppDequeueTxDatagram(&context));
- EXPECT_EQ(mTransportContext.txDatagramQueue.front, fr);
- EXPECT_EQ(mTransportContext.txDatagramQueue.pending, i - 1);
+ EXPECT_EQ(context.txDatagramQueue.front, fr);
+ EXPECT_EQ(context.txDatagramQueue.pending, i - 1);
}
- EXPECT_FALSE(chppDequeueTxDatagram(&mTransportContext));
-
- EXPECT_EQ(mTransportContext.txDatagramQueue.front, fr);
- EXPECT_EQ(mTransportContext.txDatagramQueue.pending, 0);
- }
- }
-}
-
-/**
- * Loopback testing with various length payloads of zeros
- */
-TEST_P(TransportTests, LoopbackPayloadOfZeros) {
- mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE;
- size_t len = static_cast<size_t>(GetParam());
-
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- if (len > 1 && len <= kMaxChunkSize) {
- // Loopback App header (only 2 fields required)
- mBuf[0] = CHPP_HANDLE_LOOPBACK;
- mBuf[1] = CHPP_MESSAGE_TYPE_CLIENT_REQUEST;
-
- EXPECT_TRUE(chppDispatchLoopbackClientRequest(&mAppContext, mBuf, len));
-
- uint16_t end = (mTransportContext.txDatagramQueue.front +
- mTransportContext.txDatagramQueue.pending - 1) %
- CHPP_TX_DATAGRAM_QUEUE_LEN;
-
- EXPECT_EQ(mTransportContext.txDatagramQueue.datagram[end].length, len);
- EXPECT_EQ(mTransportContext.txDatagramQueue.datagram[end].payload[0],
- CHPP_HANDLE_LOOPBACK);
- EXPECT_EQ(mTransportContext.txDatagramQueue.datagram[end].payload[1],
- CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
- }
-}
-
-/**
- * Discovery service + Transaction ID
- */
-TEST_P(TransportTests, DiscoveryAndTransactionID) {
- uint8_t transactionID = static_cast<uint8_t>(GetParam());
- size_t len = 0;
-
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(mBuf, &len);
- appHeader->handle = CHPP_HANDLE_DISCOVERY;
- appHeader->transaction = transactionID;
- appHeader->command = CHPP_DISCOVERY_COMMAND_DISCOVER_ALL;
-
- EXPECT_TRUE(chppDispatchDiscoveryClientRequest(&mAppContext, mBuf, len));
-
- uint16_t end = (mTransportContext.txDatagramQueue.front +
- mTransportContext.txDatagramQueue.pending - 1) %
- CHPP_TX_DATAGRAM_QUEUE_LEN;
-
- struct ChppAppHeader *responseHeader =
- (ChppAppHeader *)mTransportContext.txDatagramQueue.datagram[end].payload;
-
- EXPECT_EQ(responseHeader->handle, CHPP_HANDLE_DISCOVERY);
- EXPECT_EQ(responseHeader->type, CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
- EXPECT_EQ(responseHeader->transaction, transactionID);
- EXPECT_EQ(responseHeader->error, CHPP_APP_ERROR_NONE);
- EXPECT_EQ(responseHeader->command, CHPP_DISCOVERY_COMMAND_DISCOVER_ALL);
-
- // Decode discovery response
- ChppServiceDescriptor *services =
- (ChppServiceDescriptor *)&mTransportContext.txDatagramQueue.datagram[end]
- .payload[sizeof(ChppAppHeader)];
-
- // Check total length (and implicit service count)
- EXPECT_EQ(
- mTransportContext.txDatagramQueue.datagram[end].length,
- sizeof(ChppAppHeader) + kServiceCount * sizeof(ChppServiceDescriptor));
-
- // Check service configuration response
- ChppServiceDescriptor wwanServiceDescriptor = {};
- static const uint8_t uuid[CHPP_SERVICE_UUID_LEN] = CHPP_UUID_WWAN_STANDARD;
- memcpy(&wwanServiceDescriptor.uuid, &uuid,
- sizeof(wwanServiceDescriptor.uuid));
- static const char name[CHPP_SERVICE_NAME_MAX_LEN] = "WWAN";
- memcpy(&wwanServiceDescriptor.name, &name,
- sizeof(wwanServiceDescriptor.name));
- wwanServiceDescriptor.version.major = 1;
- wwanServiceDescriptor.version.minor = 0;
- wwanServiceDescriptor.version.patch = 0;
-
- EXPECT_EQ(std::memcmp(services[0].uuid, wwanServiceDescriptor.uuid,
- sizeof(wwanServiceDescriptor.uuid)),
- 0);
- EXPECT_EQ(std::memcmp(services[0].name, wwanServiceDescriptor.name,
- sizeof(wwanServiceDescriptor.name)),
- 0);
- EXPECT_EQ(services[0].version.major, wwanServiceDescriptor.version.major);
- EXPECT_EQ(services[0].version.minor, wwanServiceDescriptor.version.minor);
- EXPECT_EQ(services[0].version.patch, wwanServiceDescriptor.version.patch);
-}
-
-/**
- * CRC-32 calculation for several pre-known test vectors.
- */
-TEST_F(TransportTests, CRC32Basic) {
- static const char kTest1Str[] = "Hello World Test!";
- static const uint8_t *kTest1 = (const uint8_t *)kTest1Str;
- EXPECT_EQ(chppCrc32(0, kTest1, 17), 0x613B1D74);
- EXPECT_EQ(chppCrc32(0, kTest1, 16), 0x5F88D7D9);
- EXPECT_EQ(chppCrc32(0, kTest1, 1), 0xAA05262F);
- EXPECT_EQ(chppCrc32(0, kTest1, 0), 0x00000000);
-
- static const uint8_t kTest2[] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
- EXPECT_EQ(chppCrc32(0, kTest2, 6), 0x41D9ED00);
- EXPECT_EQ(chppCrc32(0, kTest2, 5), 0xD2FD1072);
- EXPECT_EQ(chppCrc32(0, kTest2, 4), 0xFFFFFFFF);
- EXPECT_EQ(chppCrc32(0, kTest2, 3), 0xFFFFFF00);
- EXPECT_EQ(chppCrc32(0, kTest2, 2), 0xFFFF0000);
- EXPECT_EQ(chppCrc32(0, kTest2, 1), 0xFF000000);
- EXPECT_EQ(chppCrc32(0, kTest2, 0), 0x00000000);
+ EXPECT_FALSE(chppDequeueTxDatagram(&context));
- static const char kTest3Str[] = "123456789";
- static const uint8_t *kTest3 = (const uint8_t *)kTest3Str;
- EXPECT_EQ(chppCrc32(0, kTest3, 9), 0xCBF43926);
-
- static const uint8_t kTest4[] = {0x00, 0x00, 0x00, 0x00};
- EXPECT_EQ(chppCrc32(0, kTest4, sizeof(kTest4)), 0x2144DF1C);
-
- static const uint8_t kTest5[] = {0xF2, 0x01, 0x83};
- EXPECT_EQ(chppCrc32(0, kTest5, sizeof(kTest5)), 0x24AB9D77);
-
- static const uint8_t kTest6[] = {0x0F, 0xAA, 0x00, 0x55};
- EXPECT_EQ(chppCrc32(0, kTest6, sizeof(kTest6)), 0xB6C9B287);
-
- static const uint8_t kTest7[] = {0x00, 0xFF, 0x55, 0x11};
- EXPECT_EQ(chppCrc32(0, kTest7, sizeof(kTest7)), 0x32A06212);
-
- static const uint8_t kTest8[] = {0x33, 0x22, 0x55, 0xAA, 0xBB,
- 0xCC, 0xDD, 0xEE, 0xFF};
- EXPECT_EQ(chppCrc32(0, kTest8, sizeof(kTest8)), 0xB0AE863D);
-
- static const uint8_t kTest9[] = {0x92, 0x6B, 0x55};
- EXPECT_EQ(chppCrc32(0, kTest9, sizeof(kTest9)), 0x9CDEA29B);
-}
-
-/**
- * CRC-32 calculation for daisy-chained input.
- */
-TEST_F(TransportTests, CRC32DaisyChained) {
- static const size_t kMaxLen = 10000;
- uint8_t test[kMaxLen];
- // Populate test with 8-bit LFSR
- // Feedback polynomial is x^8 + x^6 + x^5 + x^4 + 1
- static uint8_t lfsr = 1;
- for (size_t i = 0; i < kMaxLen; i++) {
- test[i] = lfsr;
- lfsr = (lfsr >> 1) |
- (((lfsr << 7) ^ (lfsr << 5) ^ (lfsr << 4) ^ (lfsr << 3)) & 0x80);
- }
-
- for (size_t len = 0; len < kMaxLen; len += 1000) {
- uint32_t fullCRC = chppCrc32(0, &test[0], len);
- for (size_t partition = 0; partition <= len; partition++) {
- uint32_t partialCRC = chppCrc32(0, &test[0], partition);
- EXPECT_EQ(chppCrc32(partialCRC, &test[partition], len - partition),
- fullCRC);
+ EXPECT_EQ(context.txDatagramQueue.front, fr);
+ EXPECT_EQ(context.txDatagramQueue.pending, 0);
}
}
}
-/**
- * WWAN service Open and GetCapabilities.
- */
-TEST_F(TransportTests, WwanOpen) {
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- uint8_t ackSeq = 1;
- uint8_t seq = 0;
- uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START;
- uint8_t transactionID = 0;
- size_t len = 0;
-
- openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
- transactionID++, CHPP_WWAN_OPEN);
-
- addPreambleToBuf(mBuf, &len);
-
- uint16_t command = CHPP_WWAN_GET_CAPABILITIES;
- sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
- transactionID++, command);
-
- size_t responseLoc = sizeof(ChppTestResponse);
-
- // Validate capabilities
- uint32_t *capabilities =
- (uint32_t *)&mTransportContext.pendingTxPacket.payload[responseLoc];
- responseLoc += sizeof(uint32_t);
-
- // Cleanup
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- uint32_t capabilitySet = CHRE_WWAN_GET_CELL_INFO;
- EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
-
- // Check total length
- EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
- sizeof(ChppWwanGetCapabilitiesResponse));
-}
-
-/**
- * WiFi service Open and GetCapabilities.
- */
-TEST_F(TransportTests, WifiOpen) {
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- uint8_t ackSeq = 1;
- uint8_t seq = 0;
- uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 1;
- uint8_t transactionID = 0;
-
- openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
- transactionID++, CHPP_WIFI_OPEN);
-
- uint16_t command = CHPP_WIFI_GET_CAPABILITIES;
- sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
- transactionID++, command);
-
- size_t responseLoc = sizeof(ChppTestResponse);
-
- // Cleanup
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- // Validate capabilities
- uint32_t *capabilities =
- (uint32_t *)&mTransportContext.pendingTxPacket.payload[responseLoc];
- responseLoc += sizeof(uint32_t);
-
- uint32_t capabilitySet = CHRE_WIFI_CAPABILITIES_SCAN_MONITORING |
- CHRE_WIFI_CAPABILITIES_ON_DEMAND_SCAN |
- CHRE_WIFI_CAPABILITIES_RADIO_CHAIN_PREF |
- CHRE_WIFI_CAPABILITIES_RTT_RANGING;
- EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
-
- // Check total length
- EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
- sizeof(ChppWwanGetCapabilitiesResponse));
-}
-
-/**
- * GNSS service Open and GetCapabilities.
- */
-TEST_F(TransportTests, GnssOpen) {
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- uint8_t ackSeq = 1;
- uint8_t seq = 0;
- uint8_t handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 2;
- uint8_t transactionID = 0;
- size_t len = 0;
-
- openService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
- transactionID++, CHPP_GNSS_OPEN);
-
- addPreambleToBuf(mBuf, &len);
-
- uint16_t command = CHPP_GNSS_GET_CAPABILITIES;
- sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle,
- transactionID++, command);
-
- size_t responseLoc = sizeof(ChppTestResponse);
-
- // Cleanup
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- // Validate capabilities
- uint32_t *capabilities =
- (uint32_t *)&mTransportContext.pendingTxPacket.payload[responseLoc];
- responseLoc += sizeof(uint32_t);
-
- uint32_t capabilitySet =
- CHRE_GNSS_CAPABILITIES_LOCATION | CHRE_GNSS_CAPABILITIES_MEASUREMENTS |
- CHRE_GNSS_CAPABILITIES_GNSS_ENGINE_BASED_PASSIVE_LISTENER;
- EXPECT_EQ((*capabilities) & ~(capabilitySet), 0);
-
- // Check total length
- EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) +
- sizeof(ChppGnssGetCapabilitiesResponse));
-}
-
-/**
- * Discovery client.
- */
-TEST_F(TransportTests, Discovery) {
- size_t len = 0;
-
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- addPreambleToBuf(mBuf, &len);
-
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &len);
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(mBuf, &len);
- appHeader->handle = CHPP_HANDLE_DISCOVERY;
- appHeader->command = CHPP_DISCOVERY_COMMAND_DISCOVER_ALL;
- appHeader->type = CHPP_MESSAGE_TYPE_SERVICE_RESPONSE;
-
- ChppServiceDescriptor wwanServiceDescriptor = {};
- static const uint8_t uuid[CHPP_SERVICE_UUID_LEN] = CHPP_UUID_WWAN_STANDARD;
- memcpy(&wwanServiceDescriptor.uuid, &uuid,
- sizeof(wwanServiceDescriptor.uuid));
- static const char name[CHPP_SERVICE_NAME_MAX_LEN] = "WWAN";
- memcpy(&wwanServiceDescriptor.name, &name,
- sizeof(wwanServiceDescriptor.name));
- wwanServiceDescriptor.version.major = 1;
- wwanServiceDescriptor.version.minor = 0;
- wwanServiceDescriptor.version.patch = 0;
-
- memcpy(&mBuf[len], &wwanServiceDescriptor, sizeof(ChppServiceDescriptor));
- len += sizeof(ChppServiceDescriptor);
-
- transHeader->length = static_cast<uint16_t>(
- len - sizeof(ChppTransportHeader) - CHPP_PREAMBLE_LEN_BYTES);
-
- addTransportFooterToBuf(mBuf, &len);
-
- // Initialize clientIndexOfServiceIndex[0] to see if it correctly updated
- // upon discovery
- mAppContext.clientIndexOfServiceIndex[0] = CHPP_CLIENT_INDEX_NONE;
-
- // Send header + payload (if any) + footer
- EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, len));
-
- // Cleanup
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- // Check for correct state
- EXPECT_EQ(mAppContext.clientIndexOfServiceIndex[0], 0);
- uint8_t nextSeq = transHeader->seq + 1;
- EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, nextSeq);
- EXPECT_EQ(mTransportContext.rxStatus.state, CHPP_STATE_PREAMBLE);
-}
-
-/**
- * Unopened clients should not crash upon an unsolicitated service response.
- */
-TEST_F(TransportTests, UnopenedClient) {
- size_t len = 0;
- uint8_t *buf = (uint8_t *)chppMalloc(100);
-
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(buf, &len);
- appHeader->handle = CHPP_HANDLE_NEGOTIATED_RANGE_START + 1;
- appHeader->command = CHPP_WIFI_CONFIGURE_SCAN_MONITOR_ASYNC;
- appHeader->type = CHPP_MESSAGE_TYPE_SERVICE_RESPONSE;
- len = sizeof(struct ChppWifiConfigureScanMonitorAsyncResponse);
-
- ASSERT_EQ(mAppContext.registeredServiceCount, kServiceCount);
-
- chppAppProcessRxDatagram(&mAppContext, buf, len);
-
- EXPECT_EQ(mTransportContext.txStatus.packetCodeToSend,
- CHPP_TRANSPORT_ERROR_APPLAYER);
-}
-
-TEST_F(TransportTests, DiscardedPacketTest) {
- mTransportContext.txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, &mTransportContext);
- WaitForTransport(&mTransportContext);
-
- // Send packet to RX thread after manually setting to resetting state.
- // We expect this packet to get dropped, but this test checks for any
- // problematic behavior (e.g. memory leaks).
- mTransportContext.resetState = CHPP_RESET_STATE_RESETTING;
-
- size_t loc = 0;
- addPreambleToBuf(mBuf, &loc);
- ChppTransportHeader *transHeader = addTransportHeaderToBuf(mBuf, &loc);
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(mBuf, &loc);
- appHeader->handle = CHPP_HANDLE_DISCOVERY;
- appHeader->command = CHPP_DISCOVERY_COMMAND_DISCOVER_ALL;
- appHeader->type = CHPP_MESSAGE_TYPE_SERVICE_RESPONSE;
-
- ChppServiceDescriptor wwanServiceDescriptor = {};
- static const uint8_t uuid[CHPP_SERVICE_UUID_LEN] = CHPP_UUID_WWAN_STANDARD;
- memcpy(&wwanServiceDescriptor.uuid, &uuid,
- sizeof(wwanServiceDescriptor.uuid));
- static const char name[CHPP_SERVICE_NAME_MAX_LEN] = "WWAN";
- memcpy(&wwanServiceDescriptor.name, &name,
- sizeof(wwanServiceDescriptor.name));
- wwanServiceDescriptor.version.major = 1;
- wwanServiceDescriptor.version.minor = 0;
- wwanServiceDescriptor.version.patch = 0;
-
- memcpy(&mBuf[loc], &wwanServiceDescriptor, sizeof(ChppServiceDescriptor));
- loc += sizeof(ChppServiceDescriptor);
-
- transHeader->length = static_cast<uint16_t>(
- loc - sizeof(ChppTransportHeader) - CHPP_PREAMBLE_LEN_BYTES);
-
- addTransportFooterToBuf(mBuf, &loc);
-
- mAppContext.clientIndexOfServiceIndex[0] = CHPP_CLIENT_INDEX_NONE;
-
- EXPECT_TRUE(chppRxDataCb(&mTransportContext, mBuf, loc));
-
- chppWorkThreadStop(&mTransportContext);
- t1.join();
-}
-
-/*
- * Correctly handle messages directed to clients / services with an invalid
- * handle number.
- */
-void messageToInvalidHandle(ChppTransportState *transportContext,
- uint8_t type) {
- size_t len = 0;
- uint8_t *buf = (uint8_t *)chppMalloc(100);
-
- transportContext->txStatus.hasPacketsToSend = true;
- std::thread t1(chppWorkThreadStart, transportContext);
- WaitForTransport(transportContext);
- chppWorkThreadStop(transportContext);
- t1.join();
-
- ChppAppHeader *appHeader = addAppHeaderToBuf(buf, &len);
- appHeader->handle =
- CHPP_HANDLE_NEGOTIATED_RANGE_START + CHPP_MAX_REGISTERED_CLIENTS;
- appHeader->type = type;
- len = sizeof(struct ChppAppHeader);
-
- chppAppProcessRxDatagram(transportContext->appContext, buf, len);
-
- EXPECT_EQ(transportContext->txStatus.packetCodeToSend,
- CHPP_TRANSPORT_ERROR_APPLAYER);
-}
-
-TEST_F(TransportTests, RequestToInvalidService) {
- messageToInvalidHandle(&mTransportContext, CHPP_MESSAGE_TYPE_CLIENT_REQUEST);
-}
-
-TEST_F(TransportTests, ResponseToInvalidClient) {
- messageToInvalidHandle(&mTransportContext,
- CHPP_MESSAGE_TYPE_SERVICE_RESPONSE);
-}
-
-TEST_F(TransportTests, NotificationToInvalidService) {
- messageToInvalidHandle(&mTransportContext,
- CHPP_MESSAGE_TYPE_CLIENT_NOTIFICATION);
-}
-
-TEST_F(TransportTests, NotificationToInvalidClient) {
- messageToInvalidHandle(&mTransportContext,
- CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION);
-}
-
INSTANTIATE_TEST_SUITE_P(TransportTestRange, TransportTests,
testing::ValuesIn(kChunkSizes));
+
} // namespace