Skip to content

Commit

Permalink
adding more tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Alami-Amine committed May 29, 2024
1 parent af22724 commit db7c410
Show file tree
Hide file tree
Showing 4 changed files with 134 additions and 216 deletions.
14 changes: 7 additions & 7 deletions src/app/tests/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -143,6 +143,8 @@ chip_test_suite("tests") {
"TestBuilderParser.cpp",
"TestMessageDef.cpp",
"TestNullable.cpp",
"TestPendingNotificationMap.cpp",
"TestPendingResponseTrackerImpl.cpp",
"TestStatusIB.cpp",
"TestStatusResponseMessage.cpp",
]
Expand All @@ -168,6 +170,11 @@ chip_test_suite("tests") {
"${chip_root}/src/lib/support:test_utils",
"${chip_root}/src/lib/support:testing",
]

# DefaultICDClientStorage assumes that raw AES key is used by the application
if (chip_crypto != "psa") {
test_sources += [ "TestDefaultICDClientStorage.cpp" ]
}
}

chip_test_suite_using_nltest("tests_nltest") {
Expand Down Expand Up @@ -195,8 +202,6 @@ chip_test_suite_using_nltest("tests_nltest") {
"TestInteractionModelEngine.cpp",
"TestNumericAttributeTraits.cpp",
"TestOperationalStateClusterObjects.cpp",
"TestPendingNotificationMap.cpp",
"TestPendingResponseTrackerImpl.cpp",
"TestPowerSourceCluster.cpp",
"TestReadInteraction.cpp",
"TestReportingEngine.cpp",
Expand All @@ -206,11 +211,6 @@ chip_test_suite_using_nltest("tests_nltest") {
"TestWriteInteraction.cpp",
]

# DefaultICDClientStorage assumes that raw AES key is used by the application
if (chip_crypto != "psa") {
test_sources += [ "TestDefaultICDClientStorage.cpp" ]
}

#
# On NRF platforms, the allocation of a large number of pbufs in this test
# to exercise chunking causes it to run out of memory. For now, disable it there.
Expand Down
162 changes: 56 additions & 106 deletions src/app/tests/TestDefaultICDClientStorage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@

#include <lib/support/Span.h>
#include <lib/support/UnitTestRegistration.h>
#include <nlunit-test.h>
#include <pw_unit_test/framework.h>
#include <system/SystemPacketBuffer.h>

#include <app/icd/client/DefaultICDClientStorage.h>
Expand Down Expand Up @@ -55,7 +55,14 @@ struct TestClientInfo : public ICDClientInfo
}
};

void TestClientInfoCount(nlTestSuite * apSuite, void * apContext)
class TestDefaultICDClientStorage : public ::testing::Test
{
public:
static void SetUpTestSuite() { ASSERT_EQ(chip::Platform::MemoryInit(), CHIP_NO_ERROR); }
static void TearDownTestSuite() { chip::Platform::MemoryShutdown(); }
};

TEST_F(TestDefaultICDClientStorage, TestClientInfoCount)
{
CHIP_ERROR err = CHIP_NO_ERROR;
FabricIndex fabricId = 1;
Expand All @@ -67,9 +74,9 @@ void TestClientInfoCount(nlTestSuite * apSuite, void * apContext)
{
DefaultICDClientStorage manager;
err = manager.Init(&clientInfoStorage, &keystore);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.UpdateFabricList(fabricId);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
// Write some ClientInfos and see the counts are correct
ICDClientInfo clientInfo1;
clientInfo1.peer_node = ScopedNodeId(nodeId1, fabricId);
Expand All @@ -78,38 +85,38 @@ void TestClientInfoCount(nlTestSuite * apSuite, void * apContext)
ICDClientInfo clientInfo3;
clientInfo3.peer_node = ScopedNodeId(nodeId1, fabricId);
err = manager.SetKey(clientInfo1, ByteSpan(kKeyBuffer1));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo1);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

err = manager.SetKey(clientInfo2, ByteSpan(kKeyBuffer2));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo2);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

err = manager.SetKey(clientInfo3, ByteSpan(kKeyBuffer3));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo3);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

ICDClientInfo clientInfo;
// Make sure iterator counts correctly
auto * iterator = manager.IterateICDClientInfo();
// same nodeId for clientInfo2 and clientInfo3, so the new one replace old one
NL_TEST_ASSERT(apSuite, iterator->Count() == 2);
EXPECT_EQ(iterator->Count(), 2u);

NL_TEST_ASSERT(apSuite, iterator->Next(clientInfo));
NL_TEST_ASSERT(apSuite, clientInfo.peer_node.GetNodeId() == nodeId2);
NL_TEST_ASSERT(apSuite, iterator->Next(clientInfo));
NL_TEST_ASSERT(apSuite, clientInfo.peer_node.GetNodeId() == nodeId1);
EXPECT_TRUE(iterator->Next(clientInfo));
EXPECT_EQ(clientInfo.peer_node.GetNodeId(), nodeId2);
EXPECT_TRUE(iterator->Next(clientInfo));
EXPECT_EQ(clientInfo.peer_node.GetNodeId(), nodeId1);

iterator->Release();

// Delete all and verify iterator counts 0
err = manager.DeleteAllEntries(fabricId);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
iterator = manager.IterateICDClientInfo();
NL_TEST_ASSERT(apSuite, iterator->Count() == 0);
EXPECT_EQ(iterator->Count(), 0u);

// Verify ClientInfos manually count correctly
size_t count = 0;
Expand All @@ -118,19 +125,19 @@ void TestClientInfoCount(nlTestSuite * apSuite, void * apContext)
count++;
}
iterator->Release();
NL_TEST_ASSERT(apSuite, count == 0);
EXPECT_EQ(count, 0u);
}

{
DefaultICDClientStorage manager;
err = manager.Init(&clientInfoStorage, &keystore);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.UpdateFabricList(fabricId);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
}
}

void TestClientInfoCountMultipleFabric(nlTestSuite * apSuite, void * apContext)
TEST_F(TestDefaultICDClientStorage, TestClientInfoCountMultipleFabric)
{
CHIP_ERROR err = CHIP_NO_ERROR;
FabricIndex fabricId1 = 1;
Expand All @@ -142,11 +149,11 @@ void TestClientInfoCountMultipleFabric(nlTestSuite * apSuite, void * apContext)
TestPersistentStorageDelegate clientInfoStorage;
TestSessionKeystoreImpl keystore;
err = manager.Init(&clientInfoStorage, &keystore);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.UpdateFabricList(fabricId1);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.UpdateFabricList(fabricId2);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

// Write some ClientInfos and see the counts are correct
ICDClientInfo clientInfo1;
Expand All @@ -157,39 +164,39 @@ void TestClientInfoCountMultipleFabric(nlTestSuite * apSuite, void * apContext)
clientInfo3.peer_node = ScopedNodeId(nodeId3, fabricId2);

err = manager.SetKey(clientInfo1, ByteSpan(kKeyBuffer1));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo1);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

err = manager.SetKey(clientInfo2, ByteSpan(kKeyBuffer2));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo2);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

err = manager.SetKey(clientInfo3, ByteSpan(kKeyBuffer3));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo3);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
// Make sure iterator counts correctly
auto * iterator = manager.IterateICDClientInfo();
NL_TEST_ASSERT(apSuite, iterator->Count() == 3);
EXPECT_EQ(iterator->Count(), 3u);
iterator->Release();

// Delete all and verify iterator counts 0
err = manager.DeleteEntry(ScopedNodeId(nodeId1, fabricId1));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
iterator = manager.IterateICDClientInfo();
NL_TEST_ASSERT(apSuite, iterator != nullptr);
ASSERT_NE(iterator, nullptr);
DefaultICDClientStorage::ICDClientInfoIteratorWrapper clientInfoIteratorWrapper(iterator);
NL_TEST_ASSERT(apSuite, iterator->Count() == 2);
EXPECT_EQ(iterator->Count(), 2u);

err = manager.DeleteEntry(ScopedNodeId(nodeId2, fabricId1));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
NL_TEST_ASSERT(apSuite, iterator->Count() == 1);
EXPECT_EQ(err, CHIP_NO_ERROR);
EXPECT_EQ(iterator->Count(), 1u);

err = manager.DeleteEntry(ScopedNodeId(nodeId3, fabricId2));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
NL_TEST_ASSERT(apSuite, iterator->Count() == 0);
EXPECT_EQ(err, CHIP_NO_ERROR);
EXPECT_EQ(iterator->Count(), 0u);

// Verify ClientInfos manually count correctly
size_t count = 0;
Expand All @@ -199,10 +206,10 @@ void TestClientInfoCountMultipleFabric(nlTestSuite * apSuite, void * apContext)
count++;
}

NL_TEST_ASSERT(apSuite, count == 0);
EXPECT_FALSE(count);
}

void TestProcessCheckInPayload(nlTestSuite * apSuite, void * apContext)
TEST_F(TestDefaultICDClientStorage, TestProcessCheckInPayload)
{
CHIP_ERROR err = CHIP_NO_ERROR;
FabricIndex fabricId = 1;
Expand All @@ -212,98 +219,41 @@ void TestProcessCheckInPayload(nlTestSuite * apSuite, void * apContext)

DefaultICDClientStorage manager;
err = manager.Init(&clientInfoStorage, &keystore);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.UpdateFabricList(fabricId);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
// Populate clientInfo
ICDClientInfo clientInfo;
clientInfo.peer_node = ScopedNodeId(nodeId, fabricId);

err = manager.SetKey(clientInfo, ByteSpan(kKeyBuffer1));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = manager.StoreEntry(clientInfo);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

uint32_t counter = 1;
System::PacketBufferHandle buffer = MessagePacketBuffer::New(chip::Protocols::SecureChannel::CheckinMessage::kMinPayloadSize);
MutableByteSpan output{ buffer->Start(), buffer->MaxDataLength() };
err = chip::Protocols::SecureChannel::CheckinMessage::GenerateCheckinMessagePayload(
clientInfo.aes_key_handle, clientInfo.hmac_key_handle, counter, ByteSpan(), output);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

buffer->SetDataLength(static_cast<uint16_t>(output.size()));
ICDClientInfo decodeClientInfo;
uint32_t checkInCounter = 0;
ByteSpan payload{ buffer->Start(), buffer->DataLength() };
err = manager.ProcessCheckInPayload(payload, decodeClientInfo, checkInCounter);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

// 2. Use a key not available in the storage for encoding
err = manager.SetKey(clientInfo, ByteSpan(kKeyBuffer2));
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);
err = chip::Protocols::SecureChannel::CheckinMessage::GenerateCheckinMessagePayload(
clientInfo.aes_key_handle, clientInfo.hmac_key_handle, counter, ByteSpan(), output);
NL_TEST_ASSERT(apSuite, err == CHIP_NO_ERROR);
EXPECT_EQ(err, CHIP_NO_ERROR);

buffer->SetDataLength(static_cast<uint16_t>(output.size()));
ByteSpan payload1{ buffer->Start(), buffer->DataLength() };
err = manager.ProcessCheckInPayload(payload1, decodeClientInfo, checkInCounter);
NL_TEST_ASSERT(apSuite, err == CHIP_ERROR_NOT_FOUND);
}

/**
* Set up the test suite.
*/
int TestClientInfo_Setup(void * apContext)
{
VerifyOrReturnError(CHIP_NO_ERROR == Platform::MemoryInit(), FAILURE);

return SUCCESS;
EXPECT_EQ(err, CHIP_ERROR_NOT_FOUND);
}

/**
* Tear down the test suite.
*/
int TestClientInfo_Teardown(void * apContext)
{
Platform::MemoryShutdown();
return SUCCESS;
}

// Test Suite

/**
* Test Suite that lists all the test functions.
*/
// clang-format off
static const nlTest sTests[] =
{
NL_TEST_DEF("TestClientInfoCount", TestClientInfoCount),
NL_TEST_DEF("TestClientInfoCountMultipleFabric", TestClientInfoCountMultipleFabric),
NL_TEST_DEF("TestProcessCheckInPayload", TestProcessCheckInPayload),

NL_TEST_SENTINEL()
};
// clang-format on

// clang-format off
static nlTestSuite sSuite =
{
"TestDefaultICDClientStorage",
&sTests[0],
&TestClientInfo_Setup, &TestClientInfo_Teardown
};
// clang-format on

/**
* Main
*/
int TestDefaultICDClientStorage()
{
// Run test suit against one context
nlTestRunner(&sSuite, nullptr);

return (nlTestRunnerStats(&sSuite));
}

CHIP_REGISTER_TEST_SUITE(TestDefaultICDClientStorage)
Loading

0 comments on commit db7c410

Please sign in to comment.