/* * * Copyright (c) 2024 Project CHIP Authors * All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // This module provides shared fixture implementations of global functions // for data model tests as well as global variables to control them. #pragma once #include #include #include #include #include #include namespace chip { namespace app { namespace DataModelTests { constexpr EndpointId kTestEndpointId = 1; constexpr ClusterId kPerpetualClusterId = Test::MockClusterId(2); constexpr AttributeId kPerpetualAttributeid = Test::MockAttributeId(1); constexpr DataVersion kRejectedDataVersion = 1; constexpr DataVersion kAcceptedDataVersion = 5; constexpr DataVersion kDataVersion = kAcceptedDataVersion; constexpr uint8_t kExampleClusterSpecificSuccess = 11u; constexpr uint8_t kExampleClusterSpecificFailure = 12u; constexpr ClusterStatus kTestSuccessClusterStatus = 1; constexpr ClusterStatus kTestFailureClusterStatus = 2; // Controls how the fixture responds to attribute reads enum class ReadResponseDirective { kSendDataResponse, kSendManyDataResponses, // Many data blocks, for a single concrete path // read, simulating a malicious server. kSendManyDataResponsesWrongPath, // Many data blocks, all using the wrong // path, for a single concrete path // read, simulating a malicious server. kSendDataError, kSendTwoDataErrors, // Multiple errors, for a single concrete path, // simulating a malicious server. }; extern ScopedChangeOnly gReadResponseDirective; // Number of reads of Clusters::UnitTesting::Attributes::Int16u that we have observed. // Every read will increment this count by 1 and return the new value. extern uint16_t gInt16uTotalReadCount; // Controls the ICD operating mode for the fixture extern ScopedChangeOnly gIsLitIcd; // Controls how the fixture responds to attribute writes enum class WriteResponseDirective { kSendAttributeSuccess, kSendAttributeError, kSendMultipleSuccess, kSendMultipleErrors, kSendClusterSpecificSuccess, kSendClusterSpecificFailure, }; extern ScopedChangeOnly gWriteResponseDirective; // Controls how the fixture responds to commands enum class CommandResponseDirective { kSendDataResponse, kSendSuccessStatusCode, kSendMultipleSuccessStatusCodes, kSendError, kSendMultipleErrors, kSendSuccessStatusCodeWithClusterStatus, kSendErrorWithClusterStatus, kAsync, }; extern ScopedChangeOnly gCommandResponseDirective; // Populated with the command handle when gCommandResponseDirective == kAsync extern CommandHandler::Handle gAsyncCommandHandle; /// A customized class for read/write/invoke that matches functionality /// with the ember-compatibility-functions functionality here. /// /// TODO: these functions currently redirect to ember functions, so could /// be merged with test-interaction-model-api.h/cpp as well. This is not done since /// if we remove the direct ember dependency from IM, we can implement /// distinct functional classes. /// TODO items for above: /// - once IM only supports DataModel /// - break ember-overrides in this h/cpp file class CustomDataModel : public DataModel::Provider { public: static CustomDataModel & Instance(); CHIP_ERROR Shutdown() override { return CHIP_NO_ERROR; } bool EventPathIncludesAccessibleConcretePath(const EventPathParams & path, const Access::SubjectDescriptor & descriptor) override { return true; } DataModel::ActionReturnStatus ReadAttribute(const DataModel::ReadAttributeRequest & request, AttributeValueEncoder & encoder) override; DataModel::ActionReturnStatus WriteAttribute(const DataModel::WriteAttributeRequest & request, AttributeValueDecoder & decoder) override; std::optional Invoke(const DataModel::InvokeRequest & request, chip::TLV::TLVReader & input_arguments, CommandHandler * handler) override; EndpointId FirstEndpoint() override; EndpointId NextEndpoint(EndpointId before) override; std::optional FirstDeviceType(EndpointId endpoint) override; std::optional NextDeviceType(EndpointId endpoint, const DataModel::DeviceTypeEntry & previous) override; DataModel::ClusterEntry FirstCluster(EndpointId endpoint) override; DataModel::ClusterEntry NextCluster(const ConcreteClusterPath & before) override; std::optional GetClusterInfo(const ConcreteClusterPath & path) override; DataModel::AttributeEntry FirstAttribute(const ConcreteClusterPath & cluster) override; DataModel::AttributeEntry NextAttribute(const ConcreteAttributePath & before) override; std::optional GetAttributeInfo(const ConcreteAttributePath & path) override; DataModel::CommandEntry FirstAcceptedCommand(const ConcreteClusterPath & cluster) override; DataModel::CommandEntry NextAcceptedCommand(const ConcreteCommandPath & before) override; std::optional GetAcceptedCommandInfo(const ConcreteCommandPath & path) override; ConcreteCommandPath FirstGeneratedCommand(const ConcreteClusterPath & cluster) override; ConcreteCommandPath NextGeneratedCommand(const ConcreteCommandPath & before) override; }; } // namespace DataModelTests } // namespace app } // namespace chip