@@ -343,6 +343,7 @@ class TestReadInteraction : public chip::Test::AppContext
343
343
void TestReadClient ();
344
344
void TestReadUnexpectedSubscriptionId ();
345
345
void TestReadHandler ();
346
+ void TestReadHandlerSetMaxReportingInterval ();
346
347
void TestReadClientGenerateAttributePathList ();
347
348
void TestReadClientGenerateInvalidAttributePathList ();
348
349
void TestReadClientInvalidReport ();
@@ -568,6 +569,115 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestReadHandler)
568
569
EXPECT_EQ (GetExchangeManager ().GetNumActiveExchanges (), 0u );
569
570
}
570
571
572
+ TEST_F_FROM_FIXTURE (TestReadInteraction, TestReadHandlerSetMaxReportingInterval)
573
+ {
574
+ System::PacketBufferTLVWriter writer;
575
+ System::PacketBufferHandle subscribeRequestbuf = System::PacketBufferHandle::New (System::PacketBuffer::kMaxSize );
576
+ SubscribeRequestMessage::Builder subscribeRequestBuilder;
577
+
578
+ auto * engine = chip::app::InteractionModelEngine::GetInstance ();
579
+ EXPECT_EQ (engine->Init (&GetExchangeManager (), &GetFabricTable (), gReportScheduler ), CHIP_NO_ERROR);
580
+
581
+ uint16_t kIntervalInfMinInterval = 119 ;
582
+ uint16_t kMinInterval = 120 ;
583
+ uint16_t kMaxIntervalCeiling = 500 ;
584
+
585
+ Messaging::ExchangeContext * exchangeCtx = NewExchangeToAlice (nullptr , false );
586
+
587
+ {
588
+
589
+ uint16_t minInterval;
590
+ uint16_t maxInterval;
591
+
592
+ // Configure ReadHandler
593
+ ReadHandler readHandler (*engine, exchangeCtx, chip::app::ReadHandler::InteractionType::Read, gReportScheduler ,
594
+ CodegenDataModelProviderInstance ());
595
+
596
+ writer.Init (std::move (subscribeRequestbuf));
597
+ EXPECT_EQ (subscribeRequestBuilder.Init (&writer), CHIP_NO_ERROR);
598
+
599
+ subscribeRequestBuilder.KeepSubscriptions (true );
600
+ EXPECT_EQ (subscribeRequestBuilder.GetError (), CHIP_NO_ERROR);
601
+
602
+ subscribeRequestBuilder.MinIntervalFloorSeconds (kMinInterval );
603
+ EXPECT_EQ (subscribeRequestBuilder.GetError (), CHIP_NO_ERROR);
604
+
605
+ subscribeRequestBuilder.MaxIntervalCeilingSeconds (kMaxIntervalCeiling );
606
+ EXPECT_EQ (subscribeRequestBuilder.GetError (), CHIP_NO_ERROR);
607
+
608
+ AttributePathIBs::Builder & attributePathListBuilder = subscribeRequestBuilder.CreateAttributeRequests ();
609
+ EXPECT_EQ (attributePathListBuilder.GetError (), CHIP_NO_ERROR);
610
+
611
+ AttributePathIB::Builder & attributePathBuilder = attributePathListBuilder.CreatePath ();
612
+ EXPECT_EQ (attributePathListBuilder.GetError (), CHIP_NO_ERROR);
613
+
614
+ attributePathBuilder.Node (1 ).Endpoint (2 ).Cluster (3 ).Attribute (4 ).ListIndex (5 ).EndOfAttributePathIB ();
615
+ EXPECT_EQ (attributePathBuilder.GetError (), CHIP_NO_ERROR);
616
+
617
+ attributePathListBuilder.EndOfAttributePathIBs ();
618
+ EXPECT_EQ (attributePathListBuilder.GetError (), CHIP_NO_ERROR);
619
+
620
+ subscribeRequestBuilder.IsFabricFiltered (false ).EndOfSubscribeRequestMessage ();
621
+ EXPECT_EQ (subscribeRequestBuilder.GetError (), CHIP_NO_ERROR);
622
+
623
+ EXPECT_EQ (subscribeRequestBuilder.GetError (), CHIP_NO_ERROR);
624
+ EXPECT_EQ (writer.Finalize (&subscribeRequestbuf), CHIP_NO_ERROR);
625
+
626
+ EXPECT_EQ (readHandler.ProcessSubscribeRequest (std::move (subscribeRequestbuf)), CHIP_NO_ERROR);
627
+
628
+ #if CHIP_CONFIG_ENABLE_ICD_SERVER
629
+ // When an ICD build, the default behavior is to select the IdleModeDuration as MaxInterval
630
+ kMaxIntervalCeiling = readHandler.GetPublisherSelectedIntervalLimit ();
631
+ #endif
632
+ // Try to change the MaxInterval while ReadHandler is active
633
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (340 ), CHIP_ERROR_INCORRECT_STATE);
634
+
635
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
636
+ EXPECT_EQ (kMaxIntervalCeiling , maxInterval);
637
+ // Set ReadHandler to Idle to allow MaxInterval changes
638
+ readHandler.MoveToState (ReadHandler::HandlerState::Idle);
639
+
640
+ // TC1: MaxInterval < MinIntervalFloor
641
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (kIntervalInfMinInterval ), CHIP_ERROR_INVALID_ARGUMENT);
642
+
643
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
644
+ EXPECT_EQ (kMaxIntervalCeiling , maxInterval);
645
+
646
+ // TC2: MaxInterval == MinIntervalFloor
647
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (kMinInterval ), CHIP_NO_ERROR);
648
+
649
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
650
+ EXPECT_EQ (kMinInterval , maxInterval);
651
+
652
+ // TC3: Minterval < MaxInterval < max(GetPublisherSelectedIntervalLimit(), mSubscriberRequestedMaxInterval)
653
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (kMaxIntervalCeiling ), CHIP_NO_ERROR);
654
+
655
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
656
+ EXPECT_EQ (kMaxIntervalCeiling , maxInterval);
657
+
658
+ // TC4: MaxInterval == Subscriber Requested Max Interval
659
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (readHandler.GetSubscriberRequestedMaxInterval ()), CHIP_NO_ERROR);
660
+
661
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
662
+ EXPECT_EQ (readHandler.GetSubscriberRequestedMaxInterval (), maxInterval);
663
+
664
+ // TC4: MaxInterval == GetPublisherSelectedIntervalLimit()
665
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (readHandler.GetPublisherSelectedIntervalLimit ()), CHIP_NO_ERROR);
666
+
667
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
668
+ EXPECT_EQ (readHandler.GetPublisherSelectedIntervalLimit (), maxInterval);
669
+
670
+ // TC5: MaxInterval > max(GetPublisherSelectedIntervalLimit(), mSubscriberRequestedMaxInterval)
671
+ EXPECT_EQ (readHandler.SetMaxReportingInterval (std::numeric_limits<uint16_t >::max ()), CHIP_ERROR_INVALID_ARGUMENT);
672
+
673
+ readHandler.GetReportingIntervals (minInterval, maxInterval);
674
+ EXPECT_EQ (readHandler.GetPublisherSelectedIntervalLimit (), maxInterval);
675
+ }
676
+
677
+ engine->Shutdown ();
678
+ EXPECT_EQ (GetExchangeManager ().GetNumActiveExchanges (), 0u );
679
+ }
680
+
571
681
TEST_F_FROM_FIXTURE (TestReadInteraction, TestReadClientGenerateAttributePathList)
572
682
{
573
683
MockInteractionModelApp delegate;
@@ -1517,6 +1627,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestICDProcessSubscribeRequestSupMaxInt
1517
1627
1518
1628
EXPECT_EQ (minInterval, kMinInterval );
1519
1629
EXPECT_EQ (maxInterval, idleModeDuration);
1630
+ EXPECT_EQ (kMaxIntervalCeiling , readHandler.GetSubscriberRequestedMaxInterval ());
1520
1631
}
1521
1632
engine->Shutdown ();
1522
1633
@@ -1584,6 +1695,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestICDProcessSubscribeRequestInfMaxInt
1584
1695
1585
1696
EXPECT_EQ (minInterval, kMinInterval );
1586
1697
EXPECT_EQ (maxInterval, idleModeDuration);
1698
+ EXPECT_EQ (kMaxIntervalCeiling , readHandler.GetSubscriberRequestedMaxInterval ());
1587
1699
}
1588
1700
engine->Shutdown ();
1589
1701
@@ -1651,6 +1763,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestICDProcessSubscribeRequestSupMinInt
1651
1763
1652
1764
EXPECT_EQ (minInterval, kMinInterval );
1653
1765
EXPECT_EQ (maxInterval, (2 * idleModeDuration));
1766
+ EXPECT_EQ (kMaxIntervalCeiling , readHandler.GetSubscriberRequestedMaxInterval ());
1654
1767
}
1655
1768
engine->Shutdown ();
1656
1769
@@ -1716,6 +1829,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestICDProcessSubscribeRequestMaxMinInt
1716
1829
1717
1830
EXPECT_EQ (minInterval, kMinInterval );
1718
1831
EXPECT_EQ (maxInterval, kMaxIntervalCeiling );
1832
+ EXPECT_EQ (kMaxIntervalCeiling , readHandler.GetSubscriberRequestedMaxInterval ());
1719
1833
}
1720
1834
engine->Shutdown ();
1721
1835
@@ -1781,6 +1895,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestICDProcessSubscribeRequestInvalidId
1781
1895
1782
1896
EXPECT_EQ (minInterval, kMinInterval );
1783
1897
EXPECT_EQ (maxInterval, kMaxIntervalCeiling );
1898
+ EXPECT_EQ (kMaxIntervalCeiling , readHandler.GetSubscriberRequestedMaxInterval ());
1784
1899
}
1785
1900
engine->Shutdown ();
1786
1901
@@ -1959,6 +2074,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestSubscribeRoundtrip)
1959
2074
uint16_t minInterval;
1960
2075
uint16_t maxInterval;
1961
2076
delegate.mpReadHandler ->GetReportingIntervals (minInterval, maxInterval);
2077
+ EXPECT_EQ (readPrepareParams.mMaxIntervalCeilingSeconds , delegate.mpReadHandler ->GetSubscriberRequestedMaxInterval ());
1962
2078
1963
2079
// Test empty report
1964
2080
// Advance monotonic timestamp for min interval to elapse
@@ -2028,6 +2144,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestSubscribeEarlyReport)
2028
2144
uint16_t minInterval;
2029
2145
uint16_t maxInterval;
2030
2146
delegate.mpReadHandler ->GetReportingIntervals (minInterval, maxInterval);
2147
+ EXPECT_EQ (readPrepareParams.mMaxIntervalCeilingSeconds , delegate.mpReadHandler ->GetSubscriberRequestedMaxInterval ());
2031
2148
2032
2149
EXPECT_EQ (engine->GetNumActiveReadHandlers (ReadHandler::InteractionType::Subscribe), 1u );
2033
2150
@@ -2760,6 +2877,7 @@ TEST_F_FROM_FIXTURE(TestReadInteraction, TestSubscribeInvalidAttributePathRoundt
2760
2877
uint16_t minInterval;
2761
2878
uint16_t maxInterval;
2762
2879
delegate.mpReadHandler ->GetReportingIntervals (minInterval, maxInterval);
2880
+ EXPECT_EQ (readPrepareParams.mMaxIntervalCeilingSeconds , delegate.mpReadHandler ->GetSubscriberRequestedMaxInterval ());
2763
2881
2764
2882
// Advance monotonic timestamp for min interval to elapse
2765
2883
gMockClock .AdvanceMonotonic (System::Clock::Seconds16 (maxInterval));
0 commit comments