blob: 668d81478d46590f7d93cf904c03b339374ae521 [file] [log] [blame]
/*
*
* Copyright (c) 2023 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.
*/
#pragma once
#include <app-common/zap-generated/attribute-type.h>
#include <app/util/af-types.h>
#include <lib/core/DataModelTypes.h>
#include <cstddef>
#include <initializer_list>
#include <vector>
namespace chip {
namespace Test {
namespace internal {
constexpr uint16_t kDefaultStringSize = 16; // note: this is INCLUDING the length byte(s)
// Determine an appropriate size for the given type.
// NOTE: this is for test only, not all types are included
uint16_t SizeForType(EmberAfAttributeType type);
constexpr EmberAfAttributeMetadata DefaultAttributeMetadata(chip::AttributeId id)
{
return EmberAfAttributeMetadata{
.defaultValue = EmberAfDefaultOrMinMaxAttributeValue(static_cast<uint32_t>(0)),
.attributeId = id,
.size = 4,
.attributeType = ZCL_INT32U_ATTRIBUTE_TYPE,
.mask = ATTRIBUTE_MASK_WRITABLE | ATTRIBUTE_MASK_NULLABLE,
};
}
} // namespace internal
struct MockAttributeConfig
{
MockAttributeConfig(AttributeId aId) : id(aId), attributeMetaData(internal::DefaultAttributeMetadata(aId)) {}
MockAttributeConfig(AttributeId aId, EmberAfAttributeMetadata metadata) : id(aId), attributeMetaData(metadata) {}
MockAttributeConfig(AttributeId aId, EmberAfAttributeType type,
EmberAfAttributeMask mask = ATTRIBUTE_MASK_WRITABLE | ATTRIBUTE_MASK_NULLABLE) :
id(aId),
attributeMetaData(internal::DefaultAttributeMetadata(aId))
{
attributeMetaData.attributeType = type;
attributeMetaData.mask = mask;
attributeMetaData.size = internal::SizeForType(type);
}
const AttributeId id;
EmberAfAttributeMetadata attributeMetaData;
};
struct MockEventConfig
{
MockEventConfig(EventId aId) : id(aId) {}
const EventId id;
};
struct MockClusterConfig
{
MockClusterConfig(ClusterId aId, std::initializer_list<MockAttributeConfig> aAttributes = {},
std::initializer_list<MockEventConfig> aEvents = {}, std::initializer_list<CommandId> aAcceptedCommands = {},
std::initializer_list<CommandId> aGeneratedCommands = {});
// Cluster-config is self-referential: mEmberCluster.attributes references mAttributeMetaData.data()
MockClusterConfig(const MockClusterConfig & other);
MockClusterConfig & operator=(const MockClusterConfig &) = delete;
const MockAttributeConfig * attributeById(AttributeId attributeId, ptrdiff_t * outIndex = nullptr) const;
const EmberAfCluster * emberCluster() const { return &mEmberCluster; }
const ClusterId id;
const std::vector<MockAttributeConfig> attributes;
const std::vector<MockEventConfig> events;
private:
EmberAfCluster mEmberCluster;
std::vector<EventId> mEmberEventList;
std::vector<EmberAfAttributeMetadata> mAttributeMetaData;
std::vector<CommandId> mAcceptedCommands;
std::vector<CommandId> mGeneratedCommands;
};
struct MockEndpointConfig
{
MockEndpointConfig(EndpointId aId, std::initializer_list<MockClusterConfig> aClusters = {});
// Endpoint-config is self-referential: mEmberEndpoint.clusters references mEmberClusters.data()
MockEndpointConfig(const MockEndpointConfig & other);
MockEndpointConfig & operator=(const MockEndpointConfig &) = delete;
const MockClusterConfig * clusterById(ClusterId clusterId, ptrdiff_t * outIndex = nullptr) const;
const EmberAfEndpointType * emberEndpoint() const { return &mEmberEndpoint; }
const EndpointId id;
const std::vector<MockClusterConfig> clusters;
private:
std::vector<EmberAfCluster> mEmberClusters;
EmberAfEndpointType mEmberEndpoint;
};
struct MockNodeConfig
{
MockNodeConfig(std::initializer_list<MockEndpointConfig> aEndpoints);
const MockEndpointConfig * endpointById(EndpointId endpointId, ptrdiff_t * outIndex = nullptr) const;
const MockClusterConfig * clusterByIds(EndpointId endpointId, ClusterId clusterId, ptrdiff_t * outClusterIndex = nullptr) const;
const std::vector<MockEndpointConfig> endpoints;
};
} // namespace Test
} // namespace chip