blob: e4a71777d17b97e4cb7d2c042ef0116717b0bc1e [file] [log] [blame]
/*
*
* Copyright (c) 2021 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 <gtest/gtest.h>
#include <lib/core/CHIPCore.h>
#include <lib/support/TestPersistentStorageDelegate.h>
#include <protocols/secure_channel/CheckInCounter.h>
#include <stdint.h>
using namespace chip;
using namespace chip::Protocols::SecureChannel;
namespace {
enum class CheckInCounterOperations : uint8_t
{
kInvalidateHalf = 1,
kInvalidateAll = 2,
};
/**
* @brief Helper function that validates CheckInCounter value after an operation for configurable input values
*
* @param startValue Starting value of the Check-In counter
* @param expectedValue Expected value after the InvalidateHalfCheckInCounterValues call
*/
void VerifyCheckInCounterValues(uint32_t startValue, uint32_t expectedValue, CheckInCounterOperations operation)
{
// Test Configuration
TestPersistentStorageDelegate storage;
CheckInCounter counter;
// Init Value of the counter is random
EXPECT_EQ(counter.Init(&storage, chip::DefaultStorageKeyAllocator::IMEventNumber(), 0x10000), CHIP_NO_ERROR);
// Set starting value
uint32_t currentValue = counter.GetValue();
uint32_t delta = startValue - currentValue;
EXPECT_EQ(counter.AdvanceBy(delta), CHIP_NO_ERROR);
EXPECT_EQ(counter.GetValue(), startValue);
// Test operation
CHIP_ERROR err = CHIP_NO_ERROR;
switch (operation)
{
case CheckInCounterOperations::kInvalidateHalf: {
EXPECT_EQ(counter.InvalidateHalfCheckInCounterValues(), CHIP_NO_ERROR);
break;
}
case CheckInCounterOperations::kInvalidateAll: {
EXPECT_EQ(counter.InvalidateAllCheckInCounterValues(), CHIP_NO_ERROR);
break;
}
default: {
err = CHIP_ERROR_UNSUPPORTED_CHIP_FEATURE;
FAIL();
}
};
EXPECT_EQ(counter.GetValue(), expectedValue);
}
TEST(TestCheckInCounter, TestInvalidateHalfCheckInCounterValues)
{
constexpr uint32_t startValue = 1;
constexpr uint32_t expectedValue = 2147483648;
VerifyCheckInCounterValues(startValue, expectedValue, CheckInCounterOperations::kInvalidateHalf);
}
TEST(TestCheckInCounter, TestInvalidateHalfCheckInCounterValuesRollover)
{
constexpr uint32_t startValue = 4294967295;
constexpr uint32_t expectedValue = 2147483646;
VerifyCheckInCounterValues(startValue, expectedValue, CheckInCounterOperations::kInvalidateHalf);
}
TEST(TestCheckInCounter, TestInvalidateHalfCheckInCounterValues0Value)
{
constexpr uint32_t startValue = 0;
constexpr uint32_t expectedValue = 2147483647;
VerifyCheckInCounterValues(startValue, expectedValue, CheckInCounterOperations::kInvalidateHalf);
}
TEST(TestCheckInCounter, TestInvalidateAllCheckInCounterValues)
{
constexpr uint32_t startValue = 105;
constexpr uint32_t expectedValue = 104;
VerifyCheckInCounterValues(startValue, expectedValue, CheckInCounterOperations::kInvalidateAll);
}
TEST(TestCheckInCounter, TestInvalidateAllCheckInCounterValues0Value)
{
constexpr uint32_t startValue = 0;
constexpr uint32_t expectedValue = UINT32_MAX;
VerifyCheckInCounterValues(startValue, expectedValue, CheckInCounterOperations::kInvalidateAll);
}
TEST(TestCheckInCounter, TestInvalidateAllCheckInCounterValuesRollover)
{
constexpr uint32_t startValue = UINT32_MAX;
constexpr uint32_t expectedValue = UINT32_MAX - 1;
VerifyCheckInCounterValues(startValue, expectedValue, CheckInCounterOperations::kInvalidateAll);
}
} // namespace