diff --git a/src/app/clusters/general-commissioning-server/CodegenIntegration.cpp b/src/app/clusters/general-commissioning-server/CodegenIntegration.cpp index e737ab5a0b5b39..b4346580d4ae23 100644 --- a/src/app/clusters/general-commissioning-server/CodegenIntegration.cpp +++ b/src/app/clusters/general-commissioning-server/CodegenIntegration.cpp @@ -19,9 +19,18 @@ #include #include +#include #include #include +#include #include +#include +#include +#include + +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED +#include // nogncheck +#endif using namespace chip; using namespace chip::app; @@ -46,7 +55,7 @@ static_assert((kGeneralCommissioningFixedClusterCount == 0) || GeneralCommissioning::StaticApplicationConfig::kFixedClusterConfig[0].endpointNumber == kRootEndpointId), "General Commissioning cluster MUST be on endpoint 0"); -RegisteredServerCluster gRegistration; +LazyRegisteredServerCluster gServer; class IntegrationDelegate : public CodegenClusterIntegration::Delegate { @@ -54,16 +63,31 @@ class IntegrationDelegate : public CodegenClusterIntegration::Delegate ServerClusterRegistration & CreateRegistration(EndpointId endpointId, unsigned clusterInstanceIndex, uint32_t optionalAttributeBits, uint32_t featureMap) override { - // Configure optional attributes based on fetched bits - gRegistration.Cluster().GetOptionalAttributes() = GeneralCommissioningCluster::OptionalAttributes(optionalAttributeBits); - return gRegistration.Registration(); + gServer.Create( + GeneralCommissioningCluster::Context { + .commissioningWindowManager = Server::GetInstance().GetCommissioningWindowManager(), // + .configurationManager = DeviceLayer::ConfigurationMgr(), // + .deviceControlServer = DeviceLayer::DeviceControlServer::DeviceControlSvr(), // + .fabricTable = Server::GetInstance().GetFabricTable(), // + .failsafeContext = Server::GetInstance().GetFailSafeContext(), // + .platformManager = DeviceLayer::PlatformMgr(), // +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + .termsAndConditionsProvider = TermsAndConditionsManager::GetInstance(), +#endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + }, + GeneralCommissioningCluster::OptionalAttributes(optionalAttributeBits)); + + return gServer.Registration(); } - ServerClusterInterface * FindRegistration(unsigned clusterInstanceIndex) override { return &gRegistration.Cluster(); } + ServerClusterInterface * FindRegistration(unsigned clusterInstanceIndex) override + { + VerifyOrReturnValue(gServer.IsConstructed(), nullptr); + return &gServer.Cluster(); + } - // Nothing to destroy: gRegistration is a global static that handles destruction - void ReleaseRegistration(unsigned clusterInstanceIndex) override {} + void ReleaseRegistration(unsigned clusterInstanceIndex) override { gServer.Destroy(); } }; } // namespace @@ -72,9 +96,8 @@ namespace chip::app::Clusters::GeneralCommissioning { GeneralCommissioningCluster * Instance() { - // we ALWAYS return this for now, however in the future this may be instantiated - // at runtime (i.e only after server is initialized.) - return &gRegistration.Cluster(); + VerifyOrReturnValue(gServer.IsConstructed(), nullptr); + return &gServer.Cluster(); } } // namespace chip::app::Clusters::GeneralCommissioning @@ -82,14 +105,13 @@ GeneralCommissioningCluster * Instance() void MatterGeneralCommissioningClusterInitCallback(EndpointId endpointId) { VerifyOrReturn(endpointId == kRootEndpointId); - IntegrationDelegate integrationDelegate; // register a singleton server (root endpoint only) // Startup() will be called automatically by the registry when context is set CodegenClusterIntegration::RegisterServer( { - .endpointId = endpointId, + .endpointId = kRootEndpointId, .clusterId = GeneralCommissioning::Id, .fixedClusterInstanceCount = GeneralCommissioning::StaticApplicationConfig::kFixedClusterConfig.size(), .maxClusterInstanceCount = 1, // Cluster is a singleton on the root node and this is the only thing supported diff --git a/src/app/clusters/general-commissioning-server/app_config_dependent_sources.cmake b/src/app/clusters/general-commissioning-server/app_config_dependent_sources.cmake index 64ba87dc1fc1e0..f3ed1d07bc4bd4 100644 --- a/src/app/clusters/general-commissioning-server/app_config_dependent_sources.cmake +++ b/src/app/clusters/general-commissioning-server/app_config_dependent_sources.cmake @@ -18,6 +18,7 @@ TARGET_SOURCES( ${APP_TARGET} PRIVATE "${CLUSTER_DIR}/CodegenIntegration.cpp" + "${CLUSTER_DIR}/CodegenIntegration.h" ) # These are the things that BUILD.gn dependencies would pull diff --git a/src/app/clusters/general-commissioning-server/general-commissioning-cluster.cpp b/src/app/clusters/general-commissioning-server/general-commissioning-cluster.cpp index 23e4aac45a233b..0862a57aaae4f3 100644 --- a/src/app/clusters/general-commissioning-server/general-commissioning-cluster.cpp +++ b/src/app/clusters/general-commissioning-server/general-commissioning-cluster.cpp @@ -26,16 +26,12 @@ #include #include #include +#include #include #include #include #include -#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED -#include //nogncheck -#include //nogncheck -#endif - using namespace chip; using namespace chip::app; using namespace chip::app::Clusters; @@ -57,10 +53,11 @@ namespace { } \ } while (false) -CHIP_ERROR ReadIfSupported(CHIP_ERROR (ConfigurationManager::*getter)(uint8_t &), AttributeValueEncoder & aEncoder) +CHIP_ERROR ReadIfSupported(ConfigurationManager & mgr, CHIP_ERROR (ConfigurationManager::*getter)(uint8_t &), + AttributeValueEncoder & aEncoder) { uint8_t data = 0; - CHIP_ERROR err = (DeviceLayer::ConfigurationMgr().*getter)(data); + CHIP_ERROR err = (mgr.*getter)(data); if (err == CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE) { data = 0; @@ -139,18 +136,20 @@ void NotifyTermsAndConditionsAttributeChangeIfRequired(const TermsAndConditionsS } #endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED -void OnPlatformEventHandler(const DeviceLayer::ChipDeviceEvent * event, intptr_t self) +void OnPlatformEventHandler(const DeviceLayer::ChipDeviceEvent * event, intptr_t arg) { if (event->Type == DeviceLayer::DeviceEventType::kFailSafeTimerExpired) { + auto self = reinterpret_cast(arg); + // Spec says to reset Breadcrumb attribute to 0. - reinterpret_cast(self)->SetBreadCrumb(0); + self->SetBreadCrumb(0); #if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED if (event->FailSafeTimerExpired.updateTermsAndConditionsHasBeenInvoked) { // Clear terms and conditions acceptance on failsafe timer expiration - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); + TermsAndConditionsProvider & tcProvider = self->ClusterContext().termsAndConditionsProvider; TermsAndConditionsState initialState, updatedState; VerifyOrReturn(CHIP_NO_ERROR == GetTermsAndConditionsAttributeState(tcProvider, initialState)); VerifyOrReturn(CHIP_NO_ERROR == tcProvider.RevertAcceptance()); @@ -190,56 +189,44 @@ DataModel::ActionReturnStatus GeneralCommissioningCluster::ReadAttribute(const D return encoder.Encode(info); } case RegulatoryConfig::Id: - return ReadIfSupported(&ConfigurationManager::GetRegulatoryLocation, encoder); + return ReadIfSupported(mClusterContext.configurationManager, &ConfigurationManager::GetRegulatoryLocation, encoder); case LocationCapability::Id: - return ReadIfSupported(&ConfigurationManager::GetLocationCapability, encoder); + return ReadIfSupported(mClusterContext.configurationManager, &ConfigurationManager::GetLocationCapability, encoder); case SupportsConcurrentConnection::Id: return encoder.Encode(CHIP_DEVICE_CONFIG_SUPPORTS_CONCURRENT_CONNECTION != 0); #if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED case TCAcceptedVersion::Id: { - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); Optional outTermsAndConditions; - - ReturnErrorOnFailure(tcProvider.GetAcceptance(outTermsAndConditions)); - + ReturnErrorOnFailure(mClusterContext.termsAndConditionsProvider.GetAcceptance(outTermsAndConditions)); return encoder.Encode(outTermsAndConditions.ValueOr(TermsAndConditions(0, 0)).GetVersion()); } case TCMinRequiredVersion::Id: { - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); Optional outTermsAndConditions; - ReturnErrorOnFailure(tcProvider.GetRequirements(outTermsAndConditions)); - + ReturnErrorOnFailure(mClusterContext.termsAndConditionsProvider.GetRequirements(outTermsAndConditions)); return encoder.Encode(outTermsAndConditions.ValueOr(TermsAndConditions(0, 0)).GetVersion()); } case TCAcknowledgements::Id: { - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); Optional outTermsAndConditions; - ReturnErrorOnFailure(tcProvider.GetAcceptance(outTermsAndConditions)); - + ReturnErrorOnFailure(mClusterContext.termsAndConditionsProvider.GetAcceptance(outTermsAndConditions)); return encoder.Encode(outTermsAndConditions.ValueOr(TermsAndConditions(0, 0)).GetValue()); } case TCAcknowledgementsRequired::Id: { - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); bool acknowledgementsRequired; - - ReturnErrorOnFailure(tcProvider.GetAcknowledgementsRequired(acknowledgementsRequired)); - + ReturnErrorOnFailure(mClusterContext.termsAndConditionsProvider.GetAcknowledgementsRequired(acknowledgementsRequired)); return encoder.Encode(acknowledgementsRequired); } case TCUpdateDeadline::Id: { - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); Optional outUpdateAcceptanceDeadline; + ReturnErrorOnFailure(mClusterContext.termsAndConditionsProvider.GetUpdateAcceptanceDeadline(outUpdateAcceptanceDeadline)); - ReturnErrorOnFailure(tcProvider.GetUpdateAcceptanceDeadline(outUpdateAcceptanceDeadline)); - + // NOTE: encoding an optional as a Nullable (they are not fully compatible) if (!outUpdateAcceptanceDeadline.HasValue()) { return encoder.EncodeNull(); } - return encoder.Encode(outUpdateAcceptanceDeadline.Value()); } #endif @@ -372,12 +359,12 @@ void GeneralCommissioningCluster::OnFabricRemoved(const FabricTable & fabricTabl #if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED // If the FabricIndex matches the last remaining entry in the Fabrics list, then the device SHALL delete all Matter // related data on the node which was created since it was commissioned. - if (Server::GetInstance().GetFabricTable().FabricCount() == 0) + if (fabricTable.FabricCount() == 0) { ChipLogProgress(Zcl, "general-commissioning-server: Last Fabric index 0x%x was removed", static_cast(fabricIndex)); - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); + TermsAndConditionsProvider & tcProvider = mClusterContext.termsAndConditionsProvider; TermsAndConditionsState initialState, updatedState; VerifyOrReturn(CHIP_NO_ERROR == GetTermsAndConditionsAttributeState(tcProvider, initialState)); VerifyOrReturn(CHIP_NO_ERROR == tcProvider.ResetAcceptance()); @@ -397,15 +384,15 @@ void GeneralCommissioningCluster::SetBreadCrumb(uint64_t value) CHIP_ERROR GeneralCommissioningCluster::Startup(ServerClusterContext & context) { ReturnErrorOnFailure(DefaultServerCluster::Startup(context)); - PlatformMgrImpl().AddEventHandler(OnPlatformEventHandler, reinterpret_cast(this)); - Server::GetInstance().GetFabricTable().AddFabricDelegate(this); + mClusterContext.platformManager.AddEventHandler(OnPlatformEventHandler, reinterpret_cast(this)); + mClusterContext.fabricTable.AddFabricDelegate(this); return CHIP_NO_ERROR; } void GeneralCommissioningCluster::Shutdown() { - PlatformMgrImpl().RemoveEventHandler(OnPlatformEventHandler, reinterpret_cast(this)); - Server::GetInstance().GetFabricTable().RemoveFabricDelegate(this); + mClusterContext.platformManager.RemoveEventHandler(OnPlatformEventHandler, reinterpret_cast(this)); + mClusterContext.fabricTable.RemoveFabricDelegate(this); DefaultServerCluster::Shutdown(); } @@ -414,7 +401,7 @@ GeneralCommissioningCluster::HandleArmFailSafe(const DataModel::InvokeRequest & const GeneralCommissioning::Commands::ArmFailSafe::DecodableType & commandData) { MATTER_TRACE_SCOPE("ArmFailSafe", "GeneralCommissioning"); - auto & failSafeContext = Server::GetInstance().GetFailSafeContext(); + auto & failSafeContext = mClusterContext.failsafeContext; Commands::ArmFailSafeResponse::Type response; ChipLogProgress(FailSafe, "GeneralCommissioning: Received ArmFailSafe (%us)", @@ -435,8 +422,7 @@ GeneralCommissioningCluster::HandleArmFailSafe(const DataModel::InvokeRequest & { // We do not allow CASE connections to arm the failsafe for the first time while the commissioning window is open in order // to allow commissioners the opportunity to obtain this failsafe for the purpose of commissioning - if (!failSafeContext.IsFailSafeArmed() && - Server::GetInstance().GetCommissioningWindowManager().IsCommissioningWindowOpen() && + if (!failSafeContext.IsFailSafeArmed() && mClusterContext.commissioningWindowManager.IsCommissioningWindowOpen() && request.subjectDescriptor->authMode == Access::AuthMode::kCase) { response.errorCode = CommissioningErrorEnum::kBusyWithOtherAdmin; @@ -472,9 +458,7 @@ GeneralCommissioningCluster::HandleCommissioningComplete(const DataModel::Invoke { MATTER_TRACE_SCOPE("CommissioningComplete", "GeneralCommissioning"); - DeviceControlServer * devCtrl = &DeviceLayer::DeviceControlServer::DeviceControlSvr(); - auto & failSafe = Server::GetInstance().GetFailSafeContext(); - auto & fabricTable = Server::GetInstance().GetFabricTable(); + auto & failSafe = mClusterContext.failsafeContext; ChipLogProgress(FailSafe, "GeneralCommissioning: Received CommissioningComplete"); @@ -490,7 +474,7 @@ GeneralCommissioningCluster::HandleCommissioningComplete(const DataModel::Invoke } #if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); + TermsAndConditionsProvider & tcProvider = mClusterContext.termsAndConditionsProvider; // Ensure required terms and conditions have been accepted, then attempt to commit Optional requiredTermsAndConditionsMaybe; @@ -559,7 +543,7 @@ GeneralCommissioningCluster::HandleCommissioningComplete(const DataModel::Invoke // Handle NOC commands if (failSafe.NocCommandHasBeenInvoked()) { - err = fabricTable.CommitPendingFabricData(); + err = mClusterContext.fabricTable.CommitPendingFabricData(); if (err != CHIP_NO_ERROR) { ChipLogError(FailSafe, "GeneralCommissioning: Failed to commit pending fabric data: %" CHIP_ERROR_FORMAT, err.Format()); @@ -574,7 +558,8 @@ GeneralCommissioningCluster::HandleCommissioningComplete(const DataModel::Invoke // Disarm the fail-safe and notify the DeviceControlServer failSafe.DisarmFailSafe(); - err = devCtrl->PostCommissioningCompleteEvent(handle->AsSecureSession()->GetPeerNodeId(), handle->GetFabricIndex()); + err = mClusterContext.deviceControlServer.PostCommissioningCompleteEvent(handle->AsSecureSession()->GetPeerNodeId(), + handle->GetFabricIndex()); CheckSuccess(err, Failure); SetBreadCrumb(0); @@ -588,7 +573,6 @@ GeneralCommissioningCluster::HandleSetRegulatoryConfig(const DataModel::InvokeRe const Commands::SetRegulatoryConfig::DecodableType & commandData) { MATTER_TRACE_SCOPE("SetRegulatoryConfig", "GeneralCommissioning"); - DeviceControlServer * server = &DeviceLayer::DeviceControlServer::DeviceControlSvr(); Commands::SetRegulatoryConfigResponse::Type response; auto & countryCode = commandData.countryCode; @@ -606,7 +590,7 @@ GeneralCommissioningCluster::HandleSetRegulatoryConfig(const DataModel::InvokeRe } uint8_t locationCapability; - if (ConfigurationMgr().GetLocationCapability(locationCapability) != CHIP_NO_ERROR) + if (mClusterContext.configurationManager.GetLocationCapability(locationCapability) != CHIP_NO_ERROR) { return Protocols::InteractionModel::Status::Failure; } @@ -622,7 +606,7 @@ GeneralCommissioningCluster::HandleSetRegulatoryConfig(const DataModel::InvokeRe return std::nullopt; } - CheckSuccess(server->SetRegulatoryConfig(location, countryCode), Failure); + CheckSuccess(mClusterContext.deviceControlServer.SetRegulatoryConfig(location, countryCode), Failure); SetBreadCrumb(commandData.breadcrumb); response.errorCode = CommissioningErrorEnum::kOk; handler->AddResponse(request.path, response); @@ -636,8 +620,8 @@ GeneralCommissioningCluster::HandleSetTCAcknowledgements(const DataModel::Invoke { MATTER_TRACE_SCOPE("SetTCAcknowledgements", "GeneralCommissioning"); - auto & failSafeContext = Server::GetInstance().GetFailSafeContext(); - TermsAndConditionsProvider & tcProvider = TermsAndConditionsManager::GetInstance(); + auto & failSafeContext = mClusterContext.failsafeContext; + TermsAndConditionsProvider & tcProvider = mClusterContext.termsAndConditionsProvider; Optional requiredTermsAndConditionsMaybe; Optional previousAcceptedTermsAndConditionsMaybe; diff --git a/src/app/clusters/general-commissioning-server/general-commissioning-cluster.h b/src/app/clusters/general-commissioning-server/general-commissioning-cluster.h index 002ba97d66dc82..dc2c828968b52f 100644 --- a/src/app/clusters/general-commissioning-server/general-commissioning-cluster.h +++ b/src/app/clusters/general-commissioning-server/general-commissioning-cluster.h @@ -17,15 +17,27 @@ #pragma once #include +#include #include #include #include +#include #include #include #include #include -#include +#include #include +#include +#include +#include + +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED +#include //nogncheck +#include //nogncheck +#endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + +#include namespace chip::app::Clusters { @@ -34,9 +46,27 @@ class GeneralCommissioningCluster : public DefaultServerCluster, chip::FabricTab public: using OptionalAttributes = OptionalAttributeSet; - GeneralCommissioningCluster() : DefaultServerCluster({ kRootEndpointId, GeneralCommissioning::Id }), mOptionalAttributes(0) {} + /// Injected dependencies of this cluster + struct Context + { + CommissioningWindowManager & commissioningWindowManager; + DeviceLayer::ConfigurationManager & configurationManager; + DeviceLayer::DeviceControlServer & deviceControlServer; + FabricTable & fabricTable; + FailSafeContext & failsafeContext; + DeviceLayer::PlatformManager & platformManager; + +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + TermsAndConditionsProvider & termsAndConditionsProvider; +#endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + }; + + GeneralCommissioningCluster(Context && context, const OptionalAttributes & attrs) : + DefaultServerCluster({ kRootEndpointId, GeneralCommissioning::Id }), mClusterContext(std::move(context)), + mOptionalAttributes(attrs) + {} - OptionalAttributes & GetOptionalAttributes() { return mOptionalAttributes; } + Context & ClusterContext() { return mClusterContext; } void SetBreadCrumb(uint64_t value) final; @@ -68,7 +98,8 @@ class GeneralCommissioningCluster : public DefaultServerCluster, chip::FabricTab #endif private: - OptionalAttributes mOptionalAttributes; + Context mClusterContext; + const OptionalAttributes mOptionalAttributes; uint64_t mBreadCrumb = 0; std::optional diff --git a/src/app/clusters/general-commissioning-server/tests/TestGeneralCommissioningCluster.cpp b/src/app/clusters/general-commissioning-server/tests/TestGeneralCommissioningCluster.cpp index ad1c0395a2f241..df8bc18b056ef1 100644 --- a/src/app/clusters/general-commissioning-server/tests/TestGeneralCommissioningCluster.cpp +++ b/src/app/clusters/general-commissioning-server/tests/TestGeneralCommissioningCluster.cpp @@ -21,12 +21,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include namespace { @@ -47,13 +49,27 @@ struct TestGeneralCommissioningCluster : public ::testing::Test static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); } }; +GeneralCommissioningCluster::Context CreateStandardContext() +{ + return + { + .commissioningWindowManager = Server::GetInstance().GetCommissioningWindowManager(), // + .configurationManager = DeviceLayer::ConfigurationMgr(), // + .deviceControlServer = DeviceLayer::DeviceControlServer::DeviceControlSvr(), // + .fabricTable = Server::GetInstance().GetFabricTable(), // + .failsafeContext = Server::GetInstance().GetFailSafeContext(), // + .platformManager = DeviceLayer::PlatformMgr(), // +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + .termsAndConditionsProvider = TermsAndConditionsManager::GetInstance(), +#endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + }; +} + TEST_F(TestGeneralCommissioningCluster, TestAttributes) { // test without optional attributes { - GeneralCommissioningCluster cluster; - auto & optionalAttributes = cluster.GetOptionalAttributes(); - optionalAttributes = GeneralCommissioningCluster::OptionalAttributes(0); + GeneralCommissioningCluster cluster(CreateStandardContext(), GeneralCommissioningCluster::OptionalAttributes(0)); ReadOnlyBufferBuilder builder; ASSERT_EQ(cluster.Attributes({ kRootEndpointId, GeneralCommissioning::Id }, builder), CHIP_NO_ERROR); @@ -87,9 +103,8 @@ TEST_F(TestGeneralCommissioningCluster, TestAttributes) // test with optional attributes { - GeneralCommissioningCluster cluster; - auto & optionalAttributes = cluster.GetOptionalAttributes(); - optionalAttributes.Set(); + GeneralCommissioningCluster cluster( + CreateStandardContext(), GeneralCommissioningCluster::OptionalAttributes().Set()); ReadOnlyBufferBuilder builder; ASSERT_EQ(cluster.Attributes({ kRootEndpointId, GeneralCommissioning::Id }, builder), CHIP_NO_ERROR); @@ -130,9 +145,10 @@ TEST_F(TestGeneralCommissioningCluster, TestAttributes) TEST_F(TestGeneralCommissioningCluster, TestAcceptedCommands) { + GeneralCommissioningCluster cluster(CreateStandardContext(), GeneralCommissioningCluster::OptionalAttributes()); + { ReadOnlyBufferBuilder builder; - GeneralCommissioningCluster cluster; ASSERT_EQ(cluster.AcceptedCommands({ kRootEndpointId, GeneralCommissioning::Id }, builder), CHIP_NO_ERROR); ReadOnlyBufferBuilder expectedBuilder; diff --git a/src/app/clusters/network-commissioning/tests/TestNetworkCommissioningCluster.cpp b/src/app/clusters/network-commissioning/tests/TestNetworkCommissioningCluster.cpp index 6949a2c58c4992..c8be06994bfb93 100644 --- a/src/app/clusters/network-commissioning/tests/TestNetworkCommissioningCluster.cpp +++ b/src/app/clusters/network-commissioning/tests/TestNetworkCommissioningCluster.cpp @@ -54,6 +54,7 @@ class NoopBreadcrumbTracker : public BreadCrumbTracker public: void SetBreadCrumb(uint64_t v) override {} }; + // initialize memory as ReadOnlyBufferBuilder may allocate struct TestNetworkCommissioningCluster : public ::testing::Test { @@ -66,7 +67,6 @@ TEST_F(TestNetworkCommissioningCluster, TestAttributes) NoopBreadcrumbTracker tracker; { Testing::FakeWiFiDriver fakeWifiDriver; - NetworkCommissioningCluster cluster(kRootEndpointId, &fakeWifiDriver, tracker); ReadOnlyBufferBuilder builder;