diff --git a/src/darwin/Framework/CHIP/MTROTAUnsolicitedBDXMessageHandler.mm b/src/darwin/Framework/CHIP/MTROTAUnsolicitedBDXMessageHandler.mm index 2352adfb3f162d..e08b42e7ba8605 100644 --- a/src/darwin/Framework/CHIP/MTROTAUnsolicitedBDXMessageHandler.mm +++ b/src/darwin/Framework/CHIP/MTROTAUnsolicitedBDXMessageHandler.mm @@ -28,10 +28,6 @@ { assertChipStackLockedByCurrentThread(); - if (mExchangeMgr) { - mExchangeMgr->UnregisterUnsolicitedMessageHandlerForProtocol(Protocols::BDX::Id); - mExchangeMgr = nullptr; - } MTROTAUnsolicitedBDXMessageHandler::mNumberOfDelegates = 0; } diff --git a/src/darwin/Framework/CHIPTests/MTROTAProviderTests.m b/src/darwin/Framework/CHIPTests/MTROTAProviderTests.m index 207c6ddcc1854e..d986ee70f900a9 100644 --- a/src/darwin/Framework/CHIPTests/MTROTAProviderTests.m +++ b/src/darwin/Framework/CHIPTests/MTROTAProviderTests.m @@ -32,6 +32,15 @@ #define ENABLE_OTA_TESTS 1 #endif +// TODO: Disable test005_DoBDXTransferAllowUpdateRequest, +// test006_DoBDXTransferWithTwoOTARequesters and +// test007_DoBDXTransferIncrementalOtaUpdate until PR #26040 is merged. +// Currently the poll interval causes delays in the BDX transfer and +// results in the test taking a long time. +#ifdef ENABLE_REAL_OTA_UPDATE_TESTS +#undef ENABLE_REAL_OTA_UPDATE_TESTS +#endif + #if ENABLE_OTA_TESTS static const uint16_t kPairingTimeoutInSeconds = 10; @@ -39,12 +48,15 @@ static const uint16_t kTimeoutWithUpdateInSeconds = 60; static const uint64_t kDeviceId1 = 0x12341234; static const uint64_t kDeviceId2 = 0x12341235; +#ifdef ENABLE_REAL_OTA_UPDATE_TESTS static const uint64_t kDeviceId3 = 0x12341236; - +#endif // ENABLE_REAL_OTA_UPDATE_TESTS // NOTE: These onboarding payloads are for the chip-ota-requestor-app, not chip-all-clusters-app static NSString * kOnboardingPayload1 = @"MT:-24J0SO527K10648G00"; // Discriminator: 1111 static NSString * kOnboardingPayload2 = @"MT:-24J0AFN00L10648G00"; // Discriminator: 1112 +#ifdef ENABLE_REAL_OTA_UPDATE_TESTS static NSString * kOnboardingPayload3 = @"MT:-24J0IRV01L10648G00"; // Discriminator: 1113 +#endif // ENABLE_REAL_OTA_UPDATE_TESTS static const uint16_t kLocalPort = 5541; static const uint16_t kTestVendorId = 0xFFF1u; @@ -1041,6 +1053,10 @@ - (void)test004_DoBDXTransferDenyUpdateRequest [self waitForExpectations:@[ checker.notifyUpdateAppliedExpectation ] timeout:kTimeoutInSeconds]; } +// TODO: Enable tests 005, 006 and 007 when PR #26040 is merged. Currently the poll interval causes delays in the BDX transfer +// and results in the tests taking a long time. With PR #26040 we eliminate the poll interval completely and hence the tests can run +// in a short time. +#ifdef ENABLE_REAL_OTA_UPDATE_TESTS - (void)test005_DoBDXTransferAllowUpdateRequest { // In this test we do the following: @@ -1546,6 +1562,7 @@ - (void)test007_DoBDXTransferIncrementalOtaUpdate // to _any_ of the above expectations. [self waitForExpectations:@[ announceResponseExpectation1 ] timeout:kTimeoutInSeconds]; } +#endif // ENABLE_REAL_OTA_UPDATE_TESTS - (void)test999_TearDown { @@ -1562,4 +1579,4 @@ @interface MTROTAProviderTests : XCTestCase @implementation MTROTAProviderTests @end -#endif // ENABLE_OTA_TESTS +#endif // ENABLE_OTA_TESTS \ No newline at end of file diff --git a/src/protocols/bdx/AsyncTransferFacilitator.cpp b/src/protocols/bdx/AsyncTransferFacilitator.cpp index d679b56405d5f8..8eba30bdc23497 100644 --- a/src/protocols/bdx/AsyncTransferFacilitator.cpp +++ b/src/protocols/bdx/AsyncTransferFacilitator.cpp @@ -34,7 +34,6 @@ void AsyncTransferFacilitator::Reset() CHIP_ERROR AsyncTransferFacilitator::SendMessage(TransferSession::OutputEvent & event) { - assertChipStackLockedByCurrentThread(); VerifyOrReturnError(mExchange, CHIP_ERROR_INCORRECT_STATE); @@ -68,6 +67,9 @@ CHIP_ERROR AsyncTransferFacilitator::SendMessage(TransferSession::OutputEvent & CHIP_ERROR AsyncTransferFacilitator::OnMessageReceived(Messaging::ExchangeContext * ec, const PayloadHeader & payloadHeader, System::PacketBufferHandle && payload) { + + VerifyOrReturnError(mExchange, CHIP_ERROR_INCORRECT_STATE); + VerifyOrReturnError(ec == mExchange.Get(), CHIP_ERROR_INCORRECT_STATE); CHIP_ERROR err = @@ -94,12 +96,7 @@ CHIP_ERROR AsyncTransferFacilitator::OnMessageReceived(Messaging::ExchangeContex // If its a message of type kMsgToSend, send the message over the exchange. if (outEvent.EventType == TransferSession::OutputEventType::kMsgToSend) { - err = SendMessage(outEvent); - if (err != CHIP_NO_ERROR) - { - // TODO: Should we abort transfer here or let the other side timeout - return err; - } + SendMessage(outEvent); } else { @@ -127,7 +124,7 @@ CHIP_ERROR AsyncTransferFacilitator::OnMessageReceived(Messaging::ExchangeContex void AsyncTransferFacilitator::OnExchangeClosing(Messaging::ExchangeContext * ec) { ChipLogDetail(BDX, "OnExchangeClosing, ec: " ChipLogFormatExchange, ChipLogValueExchange(ec)); - CleanUp(); + mExchange.Release(); } void AsyncTransferFacilitator::OnResponseTimeout(Messaging::ExchangeContext * ec) @@ -175,36 +172,26 @@ void AsyncResponder::NotifyEventHandled(CHIP_ERROR eventHandlingResult) // If there was an error, we abort the transfer. if (eventHandlingResult != CHIP_NO_ERROR) { - mTransfer.AbortTransfer(GetBdxStatusCodeFromChipError(eventHandlingResult)); - } + CleanUp(); + } else { - // We need to get the next output event from the state machine which is either a response to the - // BDX message handled by the subclass (ReceiveAccept/Block) or a status report or error or timeout - // event types. - TransferSession::OutputEvent outEvent; - - mTransfer.GetNextAction(outEvent); - while (outEvent.EventType != TransferSession::OutputEventType::kNone) - { - if (outEvent.EventType == TransferSession::OutputEventType::kMsgToSend) + // We need to get the next output event from the state machine which is a response to the + // BDX message handled by the subclass (ReceiveAccept/Block). + TransferSession::OutputEvent outEvent; + + mTransfer.GetNextAction(outEvent); + while (outEvent.EventType != TransferSession::OutputEventType::kNone) { - CHIP_ERROR err = AsyncTransferFacilitator::SendMessage(outEvent); - if (err != CHIP_NO_ERROR) + if (outEvent.EventType == TransferSession::OutputEventType::kMsgToSend) { - // TODO: Should we abort transfer here or let the other side timeout - return; + AsyncTransferFacilitator::SendMessage(outEvent); + mTransfer.GetNextAction(outEvent); + } else { + break; } - } - else if (outEvent.EventType == TransferSession::OutputEventType::kInternalError || - outEvent.EventType == TransferSession::OutputEventType::kTransferTimeout || - outEvent.EventType == TransferSession::OutputEventType::kStatusReceived) - { - HandleTransferSessionOutput(outEvent); - CleanUp(); - return; - } - mTransfer.GetNextAction(outEvent); - }; + + }; + } } } // namespace bdx