blob: 119eb29d5b22f4b5c0a4d4ff3d4ad29999d5a60c [file] [log] [blame]
/*
* 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.
*/
#include "lib/support/logging/TextOnlyLogging.h"
#include <app/AttributePathExpandIterator-Checked.h>
namespace chip {
namespace app {
AttributePathExpandIteratorChecked::AttributePathExpandIteratorChecked(DataModel::Provider * dataModel,
SingleLinkedListNode<AttributePathParams> * attributePath) :
mDataModelIterator(dataModel, attributePath),
mEmberIterator(dataModel, attributePath)
{
CheckOutputsIdentical("Constructor");
}
bool AttributePathExpandIteratorChecked::Next()
{
bool dmResult = mDataModelIterator.Next();
bool emResult = mEmberIterator.Next();
CheckOutputsIdentical("Next");
VerifyOrDie(dmResult == emResult);
return emResult;
}
bool AttributePathExpandIteratorChecked::Get(ConcreteAttributePath & aPath)
{
CheckOutputsIdentical("Get");
return mEmberIterator.Get(aPath);
}
void AttributePathExpandIteratorChecked::ResetCurrentCluster()
{
mDataModelIterator.ResetCurrentCluster();
mEmberIterator.ResetCurrentCluster();
CheckOutputsIdentical("ResetCurrentCluster");
}
void AttributePathExpandIteratorChecked::ResetTo(SingleLinkedListNode<AttributePathParams> * paths)
{
mDataModelIterator.ResetTo(paths);
mEmberIterator.ResetTo(paths);
CheckOutputsIdentical("ResetTo");
}
void AttributePathExpandIteratorChecked::CheckOutputsIdentical(const char * msg)
{
ConcreteAttributePath dmPath;
ConcreteAttributePath emPath;
bool dmResult = mDataModelIterator.Get(dmPath);
bool emResult = mEmberIterator.Get(emPath);
if (dmResult == emResult)
{
// We check for:
// - either failed result (in which case path should not matter)
// - or exact match of paths on success
//
// NOTE: extra logic because mExpanded is NOT considered in operator== (ugly...)
if ((dmResult == false) || ((dmPath == emPath) && (dmPath.mExpanded == emPath.mExpanded)))
{
// outputs are identical. All is good
return;
}
}
ChipLogProgress(Test, "Different paths in DM vs EMBER (%d and %d) in %s", dmResult, emResult, msg);
ChipLogProgress(Test, " DM PATH: 0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI " (%s)", dmPath.mEndpointId,
ChipLogValueMEI(dmPath.mClusterId), ChipLogValueMEI(dmPath.mAttributeId),
dmPath.mExpanded ? "EXPANDED" : "NOT expanded");
ChipLogProgress(Test, " EMBER PATH: 0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI " (%s)", emPath.mEndpointId,
ChipLogValueMEI(emPath.mClusterId), ChipLogValueMEI(emPath.mAttributeId),
emPath.mExpanded ? "EXPANDED" : "NOT expanded");
chipDie();
}
} // namespace app
} // namespace chip