@@ -99,18 +99,19 @@ class MockAppDelegate : public ExchangeDelegate
99
99
{
100
100
ec->GetReliableMessageContext ()->SetAckPending (false );
101
101
}
102
+
103
+ if (mExchange != ec)
104
+ {
105
+ CloseExchangeIfNeeded ();
106
+ }
107
+
102
108
if (!mRetainExchange )
103
109
{
104
110
ec->Close ();
105
111
ec = nullptr ;
106
-
107
- if (mExchange != nullptr )
108
- {
109
- mExchange ->Close ();
110
- mExchange = nullptr ;
111
- }
112
112
}
113
113
mExchange = ec;
114
+
114
115
if (mTestSuite != nullptr )
115
116
{
116
117
NL_TEST_ASSERT (mTestSuite , buffer->TotalLength () == sizeof (PAYLOAD));
@@ -121,6 +122,15 @@ class MockAppDelegate : public ExchangeDelegate
121
122
122
123
void OnResponseTimeout (ExchangeContext * ec) override {}
123
124
125
+ void CloseExchangeIfNeeded ()
126
+ {
127
+ if (mExchange != nullptr )
128
+ {
129
+ mExchange ->Close ();
130
+ mExchange = nullptr ;
131
+ }
132
+ }
133
+
124
134
bool IsOnMessageReceivedCalled = false ;
125
135
bool mDropAckResponse = false ;
126
136
bool mRetainExchange = false ;
@@ -494,7 +504,7 @@ void CheckResendApplicationMessageWithPeerExchange(nlTestSuite * inSuite, void *
494
504
rm->ClearRetransTable (rc);
495
505
}
496
506
497
- void CheckResendApplicationMessageWithLostAcks (nlTestSuite * inSuite, void * inContext)
507
+ void CheckDuplicateMessageClosedExchange (nlTestSuite * inSuite, void * inContext)
498
508
{
499
509
TestContext & ctx = *reinterpret_cast <TestContext *>(inContext);
500
510
@@ -525,58 +535,44 @@ void CheckResendApplicationMessageWithLostAcks(nlTestSuite * inSuite, void * inC
525
535
1 , // CHIP_CONFIG_RMP_DEFAULT_ACTIVE_RETRY_INTERVAL
526
536
});
527
537
528
- mockReceiver.mDropAckResponse = true ;
529
-
530
- // Let's not drop any messages. We'll drop acks for this test.
538
+ // Let's not drop the message. Expectation is that it is received by the peer, but the ack is dropped
531
539
gLoopback .mSendMessageCount = 0 ;
532
540
gLoopback .mNumMessagesToDrop = 0 ;
533
541
gLoopback .mDroppedMessageCount = 0 ;
534
542
543
+ // Drop the ack, and also close the peer exchange
544
+ mockReceiver.mDropAckResponse = true ;
545
+ mockReceiver.mRetainExchange = false ;
546
+
535
547
// Ensure the retransmit table is empty right now
536
548
NL_TEST_ASSERT (inSuite, rm->TestGetCountRetransTable () == 0 );
537
549
538
550
err = exchange->SendMessage (Echo::MsgType::EchoRequest, std::move (buffer));
539
551
NL_TEST_ASSERT (inSuite, err == CHIP_NO_ERROR);
540
- exchange->Close ();
541
552
542
- // Ensure the message was not dropped, and was added to retransmit table
553
+ // Ensure the message was sent
554
+ // The ack was dropped, and message was added to the retransmit table
543
555
NL_TEST_ASSERT (inSuite, gLoopback .mSendMessageCount == 1 );
544
556
NL_TEST_ASSERT (inSuite, gLoopback .mDroppedMessageCount == 0 );
545
557
NL_TEST_ASSERT (inSuite, rm->TestGetCountRetransTable () == 1 );
546
- NL_TEST_ASSERT (inSuite, mockReceiver.IsOnMessageReceivedCalled );
547
558
548
- // 1 tick is 64 ms, sleep 65 ms to trigger first re-transmit
549
- test_os_sleep_ms (65 );
550
- ReliableMessageMgr::Timeout (&ctx.GetSystemLayer (), rm, CHIP_SYSTEM_NO_ERROR);
551
-
552
- // Ensure the retransmit message was also not dropped, and is still there in the retransmit table
553
- NL_TEST_ASSERT (inSuite, gLoopback .mSendMessageCount == 2 );
554
- NL_TEST_ASSERT (inSuite, gLoopback .mDroppedMessageCount == 0 );
555
- NL_TEST_ASSERT (inSuite, rm->TestGetCountRetransTable () == 1 );
556
- NL_TEST_ASSERT (inSuite, mockReceiver.IsOnMessageReceivedCalled );
557
-
558
- // Let's not drop the ack on the next retry
559
+ // Let's not drop the duplicate message
559
560
mockReceiver.mDropAckResponse = false ;
560
561
561
562
// 1 tick is 64 ms, sleep 65 ms to trigger first re-transmit
562
563
test_os_sleep_ms (65 );
563
564
ReliableMessageMgr::Timeout (&ctx.GetSystemLayer (), rm, CHIP_SYSTEM_NO_ERROR);
564
565
565
- // Ensure the message was retransmitted, and is no longer in the retransmit table
566
- NL_TEST_ASSERT (inSuite, gLoopback .mSendMessageCount >= 3 );
566
+ // Ensure the retransmit message was sent and the ack was sent
567
+ // and retransmit table was cleared
568
+ NL_TEST_ASSERT (inSuite, gLoopback .mSendMessageCount == 3 );
567
569
NL_TEST_ASSERT (inSuite, gLoopback .mDroppedMessageCount == 0 );
570
+ NL_TEST_ASSERT (inSuite, rm->TestGetCountRetransTable () == 0 );
568
571
569
- // TODO - Enable test for lost CRMP ack messages
570
- // The following check is commented out because of https://github.com/project-chip/connectedhomeip/issues/7292
571
- // NL_TEST_ASSERT(inSuite, rm->TestGetCountRetransTable() == 0);
572
- NL_TEST_ASSERT (inSuite, mockReceiver.IsOnMessageReceivedCalled );
573
-
574
- mockReceiver.mTestSuite = nullptr ;
575
-
576
- err = ctx.GetExchangeManager ().UnregisterUnsolicitedMessageHandlerForType (Echo::MsgType::EchoRequest);
577
- NL_TEST_ASSERT (inSuite, err == CHIP_NO_ERROR);
572
+ mockReceiver.CloseExchangeIfNeeded ();
578
573
579
574
rm->ClearRetransTable (rc);
575
+ exchange->Close ();
580
576
}
581
577
582
578
void CheckResendSessionEstablishmentMessageWithPeerExchange (nlTestSuite * inSuite, void * inContext)
@@ -733,10 +729,7 @@ void CheckDuplicateMessage(nlTestSuite * inSuite, void * inContext)
733
729
NL_TEST_ASSERT (inSuite, gLoopback .mDroppedMessageCount == 0 );
734
730
NL_TEST_ASSERT (inSuite, rm->TestGetCountRetransTable () == 0 );
735
731
736
- if (mockReceiver.mExchange != nullptr )
737
- {
738
- mockReceiver.mExchange ->Close ();
739
- }
732
+ mockReceiver.CloseExchangeIfNeeded ();
740
733
741
734
rm->ClearRetransTable (rc);
742
735
exchange->Close ();
@@ -776,9 +769,9 @@ const nlTest sTests[] =
776
769
NL_TEST_DEF (" Test ReliableMessageMgr::CheckCloseExchangeAndResendApplicationMessage" , CheckCloseExchangeAndResendApplicationMessage),
777
770
NL_TEST_DEF (" Test ReliableMessageMgr::CheckFailedMessageRetainOnSend" , CheckFailedMessageRetainOnSend),
778
771
NL_TEST_DEF (" Test ReliableMessageMgr::CheckResendApplicationMessageWithPeerExchange" , CheckResendApplicationMessageWithPeerExchange),
779
- NL_TEST_DEF (" Test ReliableMessageMgr::CheckResendApplicationMessageWithLostAcks" , CheckResendApplicationMessageWithLostAcks),
780
772
NL_TEST_DEF (" Test ReliableMessageMgr::CheckResendSessionEstablishmentMessageWithPeerExchange" , CheckResendSessionEstablishmentMessageWithPeerExchange),
781
773
NL_TEST_DEF (" Test ReliableMessageMgr::CheckDuplicateMessage" , CheckDuplicateMessage),
774
+ NL_TEST_DEF (" Test ReliableMessageMgr::CheckDuplicateMessageClosedExchange" , CheckDuplicateMessageClosedExchange),
782
775
NL_TEST_DEF (" Test ReliableMessageMgr::CheckSendStandaloneAckMessage" , CheckSendStandaloneAckMessage),
783
776
784
777
NL_TEST_SENTINEL ()
0 commit comments