Skip to content

Commit 2550697

Browse files
bzbarsky-applepull[bot]
authored andcommitted
Add a test-only API to allow subscribing with invalid intervals. (#18855)
This allows chip-tool to test server behavior when MinIntervalFloor > MaxIntervalCeiling. Fixes #18839
1 parent c875576 commit 2550697

File tree

3 files changed

+38
-14
lines changed

3 files changed

+38
-14
lines changed

src/app/ReadClient.cpp

+14-12
Original file line numberDiff line numberDiff line change
@@ -840,11 +840,16 @@ CHIP_ERROR ReadClient::SendAutoResubscribeRequest(ReadPrepareParams && aReadPrep
840840
return err;
841841
}
842842

843-
CHIP_ERROR ReadClient::SendSubscribeRequest(ReadPrepareParams & aReadPrepareParams)
843+
CHIP_ERROR ReadClient::SendSubscribeRequest(const ReadPrepareParams & aReadPrepareParams)
844844
{
845-
CHIP_ERROR err = CHIP_NO_ERROR;
845+
VerifyOrReturnError(aReadPrepareParams.mMinIntervalFloorSeconds <= aReadPrepareParams.mMaxIntervalCeilingSeconds,
846+
CHIP_ERROR_INVALID_ARGUMENT);
847+
return SendSubscribeRequestImpl(aReadPrepareParams);
848+
}
846849

847-
VerifyOrReturnError(ClientState::Idle == mState, err = CHIP_ERROR_INCORRECT_STATE);
850+
CHIP_ERROR ReadClient::SendSubscribeRequestImpl(const ReadPrepareParams & aReadPrepareParams)
851+
{
852+
VerifyOrReturnError(ClientState::Idle == mState, CHIP_ERROR_INCORRECT_STATE);
848853

849854
// Todo: Remove the below, Update span in ReadPrepareParams
850855
Span<AttributePathParams> attributePaths(aReadPrepareParams.mpAttributePathParamsList,
@@ -853,9 +858,6 @@ CHIP_ERROR ReadClient::SendSubscribeRequest(ReadPrepareParams & aReadPreparePara
853858
Span<DataVersionFilter> dataVersionFilters(aReadPrepareParams.mpDataVersionFilterList,
854859
aReadPrepareParams.mDataVersionFilterListSize);
855860

856-
VerifyOrReturnError(aReadPrepareParams.mMinIntervalFloorSeconds <= aReadPrepareParams.mMaxIntervalCeilingSeconds,
857-
err = CHIP_ERROR_INVALID_ARGUMENT);
858-
859861
System::PacketBufferHandle msgBuf;
860862
System::PacketBufferTLVWriter writer;
861863
SubscribeRequestMessage::Builder request;
@@ -870,27 +872,27 @@ CHIP_ERROR ReadClient::SendSubscribeRequest(ReadPrepareParams & aReadPreparePara
870872
if (!attributePaths.empty())
871873
{
872874
AttributePathIBs::Builder & attributePathListBuilder = request.CreateAttributeRequests();
873-
ReturnErrorOnFailure(err = attributePathListBuilder.GetError());
875+
ReturnErrorOnFailure(attributePathListBuilder.GetError());
874876
ReturnErrorOnFailure(GenerateAttributePaths(attributePathListBuilder, attributePaths));
875877
}
876878

877879
if (!eventPaths.empty())
878880
{
879881
EventPathIBs::Builder & eventPathListBuilder = request.CreateEventRequests();
880-
ReturnErrorOnFailure(err = eventPathListBuilder.GetError());
882+
ReturnErrorOnFailure(eventPathListBuilder.GetError());
881883
ReturnErrorOnFailure(GenerateEventPaths(eventPathListBuilder, eventPaths));
882884

883885
Optional<EventNumber> eventMin;
884886
ReturnErrorOnFailure(GetMinEventNumber(aReadPrepareParams, eventMin));
885887
if (eventMin.HasValue())
886888
{
887889
EventFilterIBs::Builder & eventFilters = request.CreateEventFilters();
888-
ReturnErrorOnFailure(err = request.GetError());
890+
ReturnErrorOnFailure(request.GetError());
889891
ReturnErrorOnFailure(eventFilters.GenerateEventFilter(eventMin.Value()));
890892
}
891893
}
892894

893-
ReturnErrorOnFailure(err = request.IsFabricFiltered(aReadPrepareParams.mIsFabricFiltered).GetError());
895+
ReturnErrorOnFailure(request.IsFabricFiltered(aReadPrepareParams.mIsFabricFiltered).GetError());
894896

895897
bool encodedDataVersionList = false;
896898
TLV::TLVWriter backup;
@@ -912,13 +914,13 @@ CHIP_ERROR ReadClient::SendSubscribeRequest(ReadPrepareParams & aReadPreparePara
912914
request.Rollback(backup);
913915
}
914916

915-
ReturnErrorOnFailure(err = request.EndOfSubscribeRequestMessage().GetError());
917+
ReturnErrorOnFailure(request.EndOfSubscribeRequestMessage().GetError());
916918
ReturnErrorOnFailure(writer.Finalize(&msgBuf));
917919

918920
VerifyOrReturnError(aReadPrepareParams.mSessionHolder, CHIP_ERROR_MISSING_SECURE_SESSION);
919921

920922
mpExchangeCtx = mpExchangeMgr->NewContext(aReadPrepareParams.mSessionHolder.Get().Value(), this);
921-
VerifyOrReturnError(mpExchangeCtx != nullptr, err = CHIP_ERROR_NO_MEMORY);
923+
VerifyOrReturnError(mpExchangeCtx != nullptr, CHIP_ERROR_NO_MEMORY);
922924
mpExchangeCtx->SetResponseTimeout(kImMessageTimeout);
923925

924926
ReturnErrorOnFailure(mpExchangeCtx->SendMessage(Protocols::InteractionModel::MsgType::SubscribeRequest, std::move(msgBuf),

src/app/ReadClient.h

+14-1
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,16 @@ class ReadClient : public Messaging::ExchangeDelegate
302302
// that's the only case when the consumer moved a ReadParams into the client.
303303
CHIP_ERROR SendAutoResubscribeRequest(ReadPrepareParams && aReadPrepareParams);
304304

305+
// Like SendSubscribeRequest, but allows sending certain forms of invalid
306+
// subscribe requests that servers are expected to reject, for testing
307+
// purposes. Should only be called from tests.
308+
#if CONFIG_IM_BUILD_FOR_UNIT_TEST
309+
CHIP_ERROR SendSubscribeRequestWithoutValidation(const ReadPrepareParams & aReadPrepareParams)
310+
{
311+
return SendSubscribeRequestImpl(aReadPrepareParams);
312+
}
313+
#endif // CONFIG_IM_BUILD_FOR_UNIT_TEST
314+
305315
private:
306316
friend class TestReadInteraction;
307317
friend class InteractionModelEngine;
@@ -358,7 +368,10 @@ class ReadClient : public Messaging::ExchangeDelegate
358368
bool ResubscribeIfNeeded();
359369
// Specialized request-sending functions.
360370
CHIP_ERROR SendReadRequest(ReadPrepareParams & aReadPrepareParams);
361-
CHIP_ERROR SendSubscribeRequest(ReadPrepareParams & aSubscribePrepareParams);
371+
// SendSubscribeRequest performs som validation on aSubscribePrepareParams
372+
// and then calls SendSubscribeRequestImpl.
373+
CHIP_ERROR SendSubscribeRequest(const ReadPrepareParams & aSubscribePrepareParams);
374+
CHIP_ERROR SendSubscribeRequestImpl(const ReadPrepareParams & aSubscribePrepareParams);
362375
void UpdateDataVersionFilters(const ConcreteDataAttributePath & aPath);
363376
static void OnResubscribeTimerCallback(System::Layer * apSystemLayer, void * apAppState);
364377

src/app/tests/suites/commands/interaction_model/InteractionModel.cpp

+10-1
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,16 @@ CHIP_ERROR InteractionModelReports::ReportAttribute(DeviceProxy * device, std::v
300300

301301
auto client = std::make_unique<ReadClient>(InteractionModelEngine::GetInstance(), device->GetExchangeManager(),
302302
mBufferedReadAdapter, interactionType);
303-
ReturnErrorOnFailure(client->SendRequest(params));
303+
if (interactionType == ReadClient::InteractionType::Read)
304+
{
305+
ReturnErrorOnFailure(client->SendRequest(params));
306+
}
307+
else
308+
{
309+
// We want to allow certain kinds of spec-invalid subscriptions so we
310+
// can test how the server reacts to them.
311+
ReturnErrorOnFailure(client->SendSubscribeRequestWithoutValidation(params));
312+
}
304313
mReadClients.push_back(std::move(client));
305314
return CHIP_NO_ERROR;
306315
}

0 commit comments

Comments
 (0)