diff options
-rw-r--r-- | chpp/test/app_test.cpp | 32 | ||||
-rw-r--r-- | chpp/test/transport_test.cpp | 309 | ||||
-rw-r--r-- | java/test/cross_validation/src/com/google/android/chre/test/crossvalidator/ChreCrossValidatorSensor.java | 2 | ||||
-rw-r--r-- | platform/freertos/include/chre/target_platform/init.h | 8 | ||||
-rw-r--r-- | platform/freertos/init.cc | 26 | ||||
-rw-r--r-- | platform/shared/nanoapp_loader.cc | 1 |
6 files changed, 202 insertions, 176 deletions
diff --git a/chpp/test/app_test.cpp b/chpp/test/app_test.cpp index 248688c6..413be338 100644 --- a/chpp/test/app_test.cpp +++ b/chpp/test/app_test.cpp @@ -137,26 +137,28 @@ TEST_F(AppTestBase, FragmentedLoopback) { EXPECT_EQ(result.error, CHPP_APP_ERROR_NONE); } -TEST_F(AppTestBase, Timesync) { - constexpr uint64_t kMaxRtt = 2 * CHPP_NSEC_PER_MSEC; // in ms - constexpr int64_t kMaxOffset = 1 * CHPP_NSEC_PER_MSEC; // in ms +// Disabled because flaky (fixed in U). +// TEST_F(AppTestBase, Timesync) { +// constexpr uint64_t kMaxRtt = 2 * CHPP_NSEC_PER_MSEC; // in ms +// constexpr int64_t kMaxOffset = 1 * CHPP_NSEC_PER_MSEC; // in ms - CHPP_LOGI("Starting timesync test..."); +// CHPP_LOGI("Starting timesync test..."); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - EXPECT_TRUE(chppTimesyncMeasureOffset(&mClientAppContext)); - std::this_thread::sleep_for(std::chrono::milliseconds(100)); +// std::this_thread::sleep_for(std::chrono::milliseconds(100)); +// EXPECT_TRUE(chppTimesyncMeasureOffset(&mClientAppContext)); +// std::this_thread::sleep_for(std::chrono::milliseconds(100)); - EXPECT_EQ(chppTimesyncGetResult(&mClientAppContext)->error, - CHPP_APP_ERROR_NONE); +// EXPECT_EQ(chppTimesyncGetResult(&mClientAppContext)->error, +// CHPP_APP_ERROR_NONE); - EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->rttNs, kMaxRtt); - EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->rttNs, 0); +// EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->rttNs, kMaxRtt); +// EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->rttNs, 0); - EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, kMaxOffset); - EXPECT_GT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, -kMaxOffset); - EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->offsetNs, 0); -} +// EXPECT_LT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, kMaxOffset); +// EXPECT_GT(chppTimesyncGetResult(&mClientAppContext)->offsetNs, +// -kMaxOffset); +// EXPECT_NE(chppTimesyncGetResult(&mClientAppContext)->offsetNs, 0); +// } TEST_F(AppTestBase, DiscoveryMatched) { constexpr uint64_t kTimeoutMs = 5000; diff --git a/chpp/test/transport_test.cpp b/chpp/test/transport_test.cpp index 625cfdee..8a412c8d 100644 --- a/chpp/test/transport_test.cpp +++ b/chpp/test/transport_test.cpp @@ -392,115 +392,119 @@ TEST_P(TransportTests, ZeroThenPreambleInput) { } } -/** - * Rx Testing with various length payloads of zeros - */ -TEST_P(TransportTests, RxPayloadOfZeros) { - mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE; - 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); - - transHeader->length = static_cast<uint16_t>(len); - loc += len; - - addTransportFooterToBuf(mBuf, &loc); - - // 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); - } else { - EXPECT_EQ(mTransportContext.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); - - // 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); - } - - // Should have complete packet payload by now - EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, validLen ? len : 0); - - // But no ACK yet - EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, transHeader->seq); - - // Send footer - EXPECT_TRUE(chppRxDataCb( - &mTransportContext, - &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) + len], - sizeof(ChppTransportFooter))); - - // 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); - - // 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); - - WaitForTransport(&mTransportContext); - - // Check response packet fields - struct ChppTransportHeader *txHeader = - (struct ChppTransportHeader *)&mTransportContext.pendingTxPacket - .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->ackSeq, nextSeq); - EXPECT_EQ(txHeader->length, 0); - - // Check outgoing packet length - EXPECT_EQ(mTransportContext.pendingTxPacket.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(); -} +// Disabled because flaky (fixed in U). +// /** +// * Rx Testing with various length payloads of zeros +// */ +// TEST_P(TransportTests, RxPayloadOfZeros) { +// mTransportContext.rxStatus.state = CHPP_STATE_PREAMBLE; +// 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); + +// transHeader->length = static_cast<uint16_t>(len); +// loc += len; + +// addTransportFooterToBuf(mBuf, &loc); + +// // 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); +// } else { +// EXPECT_EQ(mTransportContext.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); + +// // 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); +// } + +// // Should have complete packet payload by now +// EXPECT_EQ(mTransportContext.rxStatus.locInDatagram, validLen ? len : 0); + +// // But no ACK yet +// EXPECT_EQ(mTransportContext.rxStatus.expectedSeq, transHeader->seq); + +// // Send footer +// EXPECT_TRUE(chppRxDataCb( +// &mTransportContext, +// &mBuf[CHPP_PREAMBLE_LEN_BYTES + sizeof(ChppTransportHeader) + len], +// sizeof(ChppTransportFooter))); + +// // 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); + +// // 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); + +// WaitForTransport(&mTransportContext); + +// // Check response packet fields +// struct ChppTransportHeader *txHeader = +// (struct ChppTransportHeader *)&mTransportContext.pendingTxPacket +// .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->ackSeq, nextSeq); +// EXPECT_EQ(txHeader->length, 0); + +// // Check outgoing packet length +// EXPECT_EQ(mTransportContext.pendingTxPacket.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 @@ -921,49 +925,51 @@ TEST_F(TransportTests, WifiOpen) { sizeof(ChppWwanGetCapabilitiesResponse)); } -/** - * GNSS service Open and GetCapabilities. - */ -TEST_F(TransportTests, GnssOpen) { - mTransportContext.txStatus.hasPacketsToSend = true; - std::thread t1(chppWorkThreadStart, &mTransportContext); - WaitForTransport(&mTransportContext); +// Disabled because flaky (fixed in U). +// /** +// * 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; +// 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); +// openService(&mTransportContext, mBuf, ackSeq++, seq++, handle, +// transactionID++, CHPP_GNSS_OPEN); - addPreambleToBuf(mBuf, &len); +// addPreambleToBuf(mBuf, &len); - uint16_t command = CHPP_GNSS_GET_CAPABILITIES; - sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle, - transactionID++, command); +// uint16_t command = CHPP_GNSS_GET_CAPABILITIES; +// sendCommandToService(&mTransportContext, mBuf, ackSeq++, seq++, handle, +// transactionID++, command); - size_t responseLoc = sizeof(ChppTestResponse); +// size_t responseLoc = sizeof(ChppTestResponse); - // Cleanup - chppWorkThreadStop(&mTransportContext); - t1.join(); +// // Cleanup +// chppWorkThreadStop(&mTransportContext); +// t1.join(); - // Validate capabilities - uint32_t *capabilities = - (uint32_t *)&mTransportContext.pendingTxPacket.payload[responseLoc]; - responseLoc += sizeof(uint32_t); +// // 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); +// 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)); -} +// // Check total length +// EXPECT_EQ(responseLoc, CHPP_PREAMBLE_LEN_BYTES + +// sizeof(ChppTransportHeader) + +// sizeof(ChppGnssGetCapabilitiesResponse)); +// } /** * Discovery client. @@ -1140,15 +1146,16 @@ TEST_F(TransportTests, NotificationToInvalidClient) { CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION); } -TEST_F(TransportTests, WorkMonitorInvoked) { - // Send message to spin work thread so it interacts with the work monitor - messageToInvalidHandle(&mTransportContext, - CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION); +// Disabled because flaky (fixed in U). +// TEST_F(TransportTests, WorkMonitorInvoked) { +// // Send message to spin work thread so it interacts with the work monitor +// messageToInvalidHandle(&mTransportContext, +// CHPP_MESSAGE_TYPE_SERVICE_NOTIFICATION); - // 1 pre/post call for executing the work and 1 for shutting down the thread. - EXPECT_EQ(mTransportContext.workMonitor.numPreProcessCalls, 2); - EXPECT_EQ(mTransportContext.workMonitor.numPostProcessCalls, 2); -} +// // 1 pre/post call for executing the work and 1 for shutting down the +// thread. EXPECT_EQ(mTransportContext.workMonitor.numPreProcessCalls, 2); +// EXPECT_EQ(mTransportContext.workMonitor.numPostProcessCalls, 2); +// } INSTANTIATE_TEST_SUITE_P(TransportTestRange, TransportTests, testing::ValuesIn(kChunkSizes)); diff --git a/java/test/cross_validation/src/com/google/android/chre/test/crossvalidator/ChreCrossValidatorSensor.java b/java/test/cross_validation/src/com/google/android/chre/test/crossvalidator/ChreCrossValidatorSensor.java index 11a965eb..e73ec0c4 100644 --- a/java/test/cross_validation/src/com/google/android/chre/test/crossvalidator/ChreCrossValidatorSensor.java +++ b/java/test/cross_validation/src/com/google/android/chre/test/crossvalidator/ChreCrossValidatorSensor.java @@ -77,7 +77,7 @@ public class ChreCrossValidatorSensor private static final long SAMPLING_LATENCY_IN_MS = 0; - private static final long MAX_TIMESTAMP_DIFF_NS = 10000000L; + private static final long MAX_TIMESTAMP_DIFF_NS = 4000000L; private static final float AP_PROXIMITY_SENSOR_FAR_DISTANCE_IN_CM = 5f; diff --git a/platform/freertos/include/chre/target_platform/init.h b/platform/freertos/include/chre/target_platform/init.h index 4c8927dc..01e8cccc 100644 --- a/platform/freertos/include/chre/target_platform/init.h +++ b/platform/freertos/include/chre/target_platform/init.h @@ -40,6 +40,14 @@ namespace freertos { BaseType_t init(); /** + * This function initializes the and starts the logger so it's ready to accept + * logs. Spawns a (non-privileged) FreeRTOS task for sending logs to the host. + * + * @return pdPASS on success, a FreeRTOS error code otherwise. + */ +BaseType_t initLogger(); + +/** * Delete the task spawned in the init function */ void deinit(); diff --git a/platform/freertos/init.cc b/platform/freertos/init.cc index c993b406..524d3131 100644 --- a/platform/freertos/init.cc +++ b/platform/freertos/init.cc @@ -95,15 +95,7 @@ BaseType_t init() { DramVoteClientSingleton::init(); -#ifdef CHRE_USE_BUFFERED_LOGGING - chre::LogBufferManagerSingleton::init(gPrimaryLogBufferData, - gSecondaryLogBufferData, - sizeof(gPrimaryLogBufferData)); - - rc = xTaskCreate(chreFlushLogsToHostThreadEntry, getChreFlushTaskName(), - kChreTaskStackDepthWords, nullptr /* args */, - kChreTaskPriority, &gChreFlushTaskHandle); -#endif + rc = initLogger(); if (rc == pdPASS) { rc = xTaskCreate(chreThreadEntry, getChreTaskName(), @@ -118,6 +110,22 @@ BaseType_t init() { return rc; } +BaseType_t initLogger() { + BaseType_t rc = pdPASS; +#ifdef CHRE_USE_BUFFERED_LOGGING + if (!chre::LogBufferManagerSingleton::isInitialized()) { + chre::LogBufferManagerSingleton::init(gPrimaryLogBufferData, + gSecondaryLogBufferData, + sizeof(gPrimaryLogBufferData)); + + rc = xTaskCreate(chreFlushLogsToHostThreadEntry, getChreFlushTaskName(), + kChreTaskStackDepthWords, nullptr /* args */, + kChreTaskPriority, &gChreFlushTaskHandle); + } +#endif + return rc; +} + void deinit() { // On a deinit call, we just stop the CHRE event loop. This causes the 'run' // method in the task function exit, and move on to handle task cleanup diff --git a/platform/shared/nanoapp_loader.cc b/platform/shared/nanoapp_loader.cc index df6019dc..acbc13ac 100644 --- a/platform/shared/nanoapp_loader.cc +++ b/platform/shared/nanoapp_loader.cc @@ -182,6 +182,7 @@ const ExportedData gExportedData[] = { ADD_EXPORTED_C_SYMBOL(log1pf), ADD_EXPORTED_C_SYMBOL(log2f), ADD_EXPORTED_C_SYMBOL(logf), + ADD_EXPORTED_C_SYMBOL(lrintf), ADD_EXPORTED_C_SYMBOL(lroundf), ADD_EXPORTED_C_SYMBOL(powf), ADD_EXPORTED_C_SYMBOL(remainderf), |