diff --git a/src/BUILD.gn b/src/BUILD.gn index 6bf4a2ed6d7071..8fedfa15e43fd8 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -66,6 +66,8 @@ if (chip_build_tests) { "${chip_root}/src/protocols/interaction_model/tests", "${chip_root}/src/protocols/user_directed_commissioning/tests", "${chip_root}/src/transport/retransmit/tests", + "${chip_root}/src/app/icd/server/tests", + "${chip_root}/src/app/icd/server/tests:tests_nltest", ] # Skip DNSSD tests for Mbed platform due to flash memory size limitations diff --git a/src/app/icd/server/tests/BUILD.gn b/src/app/icd/server/tests/BUILD.gn new file mode 100644 index 00000000000000..727dd135d41c2d --- /dev/null +++ b/src/app/icd/server/tests/BUILD.gn @@ -0,0 +1,50 @@ +# Copyright (c) 2024 Project CHIP Authors +# +# 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. + +import("//build_overrides/build.gni") +import("//build_overrides/chip.gni") +import("//build_overrides/nlunit_test.gni") +import("//build_overrides/pigweed.gni") +import("${chip_root}/build/chip/chip_test_suite.gni") +import("${chip_root}/src/app/icd/icd.gni") + +chip_test_suite_using_nltest("tests_nltest") { + output_name = "libICDServerTestsNL" + + test_sources = [ "TestICDManager.cpp" ] + + public_deps = [ + "${chip_root}/src/app/icd/server:manager", + "${chip_root}/src/app/icd/server:monitoring-table", + "${chip_root}/src/lib/support:test_utils", + "${chip_root}/src/lib/support:testing", + "${chip_root}/src/lib/support:testing_nlunit", + "${chip_root}/src/messaging/tests:helpers", + "${nlunit_test_root}:nlunit-test", + ] +} + +chip_test_suite("tests") { + output_name = "libICDServerTests" + + test_sources = [ "TestICDMonitoringTable.cpp" ] + + public_deps = [ + "${chip_root}/src/app/icd/server:monitoring-table", + "${chip_root}/src/lib/support:test_utils", + "${chip_root}/src/lib/support:testing", + ] + + cflags = [ "-Wconversion" ] +} diff --git a/src/app/tests/TestICDManager.cpp b/src/app/icd/server/tests/TestICDManager.cpp similarity index 98% rename from src/app/tests/TestICDManager.cpp rename to src/app/icd/server/tests/TestICDManager.cpp index ea49e0ac557fc8..79b1ee817632bd 100644 --- a/src/app/tests/TestICDManager.cpp +++ b/src/app/icd/server/tests/TestICDManager.cpp @@ -15,14 +15,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -#include #include #include #include #include +#include #include #include -#include +#include #include #include #include @@ -30,11 +30,10 @@ #include #include #include +#include #include #include -#include - using namespace chip; using namespace chip::app; using namespace chip::System; @@ -119,16 +118,19 @@ class TestSubscriptionsInfoProvider : public SubscriptionsInfoProvider bool mHasPersistedSubscription = false; }; -class TestContext : public chip::Test::AppContext +class TestContext : public chip::Test::LoopbackMessagingContext { public: // Performs shared setup for all tests in the test suite CHIP_ERROR SetUpTestSuite() override { - ReturnErrorOnFailure(chip::Test::AppContext::SetUpTestSuite()); + ReturnErrorOnFailure(LoopbackMessagingContext::SetUpTestSuite()); + ReturnErrorOnFailure(chip::DeviceLayer::PlatformMgr().InitChipStack()); + DeviceLayer::SetSystemLayerForTesting(&GetSystemLayer()); mRealClock = &chip::System::SystemClock(); System::Clock::Internal::SetSystemClockForTesting(&mMockClock); + return CHIP_NO_ERROR; } @@ -137,16 +139,20 @@ class TestContext : public chip::Test::AppContext { System::Clock::Internal::SetSystemClockForTesting(mRealClock); DeviceLayer::SetSystemLayerForTesting(nullptr); - chip::Test::AppContext::TearDownTestSuite(); + + chip::DeviceLayer::PlatformMgr().Shutdown(); + LoopbackMessagingContext::TearDownTestSuite(); } // Performs setup for each individual test in the test suite CHIP_ERROR SetUp() override { - ReturnErrorOnFailure(chip::Test::AppContext::SetUp()); + ReturnErrorOnFailure(LoopbackMessagingContext::SetUp()); + mICDStateObserver.ResetAll(); mICDManager.RegisterObserver(&mICDStateObserver); mICDManager.Init(&testStorage, &GetFabricTable(), &mKeystore, &GetExchangeManager(), &mSubInfoProvider); + return CHIP_NO_ERROR; } @@ -154,7 +160,7 @@ class TestContext : public chip::Test::AppContext void TearDown() override { mICDManager.Shutdown(); - chip::Test::AppContext::TearDown(); + LoopbackMessagingContext::TearDown(); } System::Clock::Internal::MockClock mMockClock; @@ -653,6 +659,7 @@ class TestICDManager NL_TEST_ASSERT(aSuite, stayActivePromisedMs == 20000); } +#if CHIP_CONFIG_ENABLE_ICD_CIP #if CHIP_CONFIG_PERSIST_SUBSCRIPTIONS #if CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION static void TestShouldCheckInMsgsBeSentAtActiveModeFunction(nlTestSuite * aSuite, void * aContext) @@ -723,6 +730,7 @@ class TestICDManager NL_TEST_ASSERT(aSuite, ctx->mICDManager.ShouldCheckInMsgsBeSentAtActiveModeFunction(kTestFabricIndex1, kClientNodeId11)); } #endif // CHIP_CONFIG_PERSIST_SUBSCRIPTIONS +#endif // CHIP_CONFIG_ENABLE_ICD_CIP static void TestHandleTestEventTriggerActiveModeReq(nlTestSuite * aSuite, void * aContext) { @@ -1117,27 +1125,29 @@ namespace { static const nlTest sTests[] = { NL_TEST_DEF("TestICDModeDurations", TestICDManager::TestICDModeDurations), NL_TEST_DEF("TestOnSubscriptionReport", TestICDManager::TestOnSubscriptionReport), - NL_TEST_DEF("TestICDModeDurationsWith0ActiveModeDurationWithoutActiveSub", - TestICDManager::TestICDModeDurationsWith0ActiveModeDurationWithoutActiveSub), - NL_TEST_DEF("TestICDModeDurationsWith0ActiveModeDurationWithActiveSub", - TestICDManager::TestICDModeDurationsWith0ActiveModeDurationWithActiveSub), NL_TEST_DEF("TestKeepActivemodeRequests", TestICDManager::TestKeepActivemodeRequests), - NL_TEST_DEF("TestICDMRegisterUnregisterEvents", TestICDManager::TestICDMRegisterUnregisterEvents), - NL_TEST_DEF("TestICDCounter", TestICDManager::TestICDCounter), NL_TEST_DEF("TestICDStayActive", TestICDManager::TestICDMStayActive), +#if CHIP_CONFIG_ENABLE_ICD_CIP + NL_TEST_DEF("TestICDCounter", TestICDManager::TestICDCounter), + NL_TEST_DEF("TestICDMRegisterUnregisterEvents", TestICDManager::TestICDMRegisterUnregisterEvents), + NL_TEST_DEF("TestICDModeDurationsWith0ActiveModeDurationWithActiveSub", + TestICDManager::TestICDModeDurationsWith0ActiveModeDurationWithActiveSub), + NL_TEST_DEF("TestICDModeDurationsWith0ActiveModeDurationWithoutActiveSub", + TestICDManager::TestICDModeDurationsWith0ActiveModeDurationWithoutActiveSub), NL_TEST_DEF("TestShouldCheckInMsgsBeSentAtActiveModeFunction", TestICDManager::TestShouldCheckInMsgsBeSentAtActiveModeFunction), - NL_TEST_DEF("TestHandleTestEventTriggerActiveModeReq", TestICDManager::TestHandleTestEventTriggerActiveModeReq), NL_TEST_DEF("TestHandleTestEventTriggerInvalidateHalfCounterValues", TestICDManager::TestHandleTestEventTriggerInvalidateHalfCounterValues), NL_TEST_DEF("TestHandleTestEventTriggerInvalidateAllCounterValues", TestICDManager::TestHandleTestEventTriggerInvalidateAllCounterValues), + NL_TEST_DEF("TestICDStateObserverOnICDModeChange", TestICDManager::TestICDStateObserverOnICDModeChange), + NL_TEST_DEF("TestICDStateObserverOnICDModeChangeOnInit", TestICDManager::TestICDStateObserverOnICDModeChangeOnInit), +#endif // CHIP_CONFIG_ENABLE_ICD_CIP + NL_TEST_DEF("TestHandleTestEventTriggerActiveModeReq", TestICDManager::TestHandleTestEventTriggerActiveModeReq), NL_TEST_DEF("TestICDStateObserverOnEnterIdleModeActiveModeDuration", TestICDManager::TestICDStateObserverOnEnterIdleModeActiveModeDuration), NL_TEST_DEF("TestICDStateObserverOnEnterIdleModeActiveModeThreshold", TestICDManager::TestICDStateObserverOnEnterIdleModeActiveModeThreshold), NL_TEST_DEF("TestICDStateObserverOnEnterActiveMode", TestICDManager::TestICDStateObserverOnEnterActiveMode), - NL_TEST_DEF("TestICDStateObserverOnICDModeChange", TestICDManager::TestICDStateObserverOnICDModeChange), - NL_TEST_DEF("TestICDStateObserverOnICDModeChangeOnInit", TestICDManager::TestICDStateObserverOnICDModeChangeOnInit), NL_TEST_DEF("TestICDStateObserverOnTransitionToIdleModeGreaterActiveModeDuration", TestICDManager::TestICDStateObserverOnTransitionToIdleModeGreaterActiveModeDuration), NL_TEST_DEF("TestICDStateObserverOnTransitionToIdleModeEqualActiveModeDuration", diff --git a/src/app/icd/server/tests/TestICDMonitoringTable.cpp b/src/app/icd/server/tests/TestICDMonitoringTable.cpp new file mode 100644 index 00000000000000..ef1e5b32468b7a --- /dev/null +++ b/src/app/icd/server/tests/TestICDMonitoringTable.cpp @@ -0,0 +1,413 @@ +/* + * + * Copyright (c) 2022 Project CHIP Authors + * + * 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 +#include +#include +#include +#include +#include +#include + +using namespace chip; + +using TestSessionKeystoreImpl = Crypto::DefaultSessionKeystore; + +namespace { + +constexpr uint16_t kMaxTestClients1 = 2; +constexpr uint16_t kMaxTestClients2 = 1; +constexpr FabricIndex kTestFabricIndex1 = 1; +constexpr FabricIndex kTestFabricIndex2 = kMaxValidFabricIndex; +constexpr uint64_t kClientNodeId11 = 0x100001; +constexpr uint64_t kClientNodeId12 = 0x100002; +constexpr uint64_t kClientNodeId13 = 0x100003; +constexpr uint64_t kClientNodeId21 = 0x200001; +constexpr uint64_t kClientNodeId22 = 0x200002; + +constexpr uint8_t kKeyBuffer0a[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; +constexpr uint8_t kKeyBuffer0b[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; + +constexpr uint8_t kKeyBuffer1a[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f +}; +constexpr uint8_t kKeyBuffer1b[] = { + 0xf1, 0xe1, 0xd1, 0xc1, 0xb1, 0xa1, 0x91, 0x81, 0x71, 0x61, 0x51, 0x14, 0x31, 0x21, 0x11, 0x01 +}; +constexpr uint8_t kKeyBuffer2a[] = { + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f +}; +constexpr uint8_t kKeyBuffer2b[] = { + 0xf2, 0xe2, 0xd2, 0xc2, 0xb2, 0xa2, 0x92, 0x82, 0x72, 0x62, 0x52, 0x42, 0x32, 0x22, 0x12, 0x02 +}; +constexpr uint8_t kKeyBuffer3a[] = { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f +}; + +TEST(TestICDMonitoringTable, TestEntryAssignationOverload) +{ + TestSessionKeystoreImpl keystore; + ICDMonitoringEntry entry(&keystore); + + // Test Setting Key + EXPECT_EQ(entry.SetKey(ByteSpan(kKeyBuffer1a)), CHIP_NO_ERROR); + + entry.fabricIndex = 2; + + EXPECT_FALSE(entry.IsValid()); + + entry.checkInNodeID = 34; + entry.monitoredSubject = 32; + + // Entry should be valid now + EXPECT_TRUE(entry.IsValid()); + + ICDMonitoringEntry entry2; + + EXPECT_FALSE(entry2.IsValid()); + + entry2 = entry; + + EXPECT_TRUE(entry2.IsValid()); + + EXPECT_EQ(entry.fabricIndex, entry2.fabricIndex); + EXPECT_EQ(entry.checkInNodeID, entry2.checkInNodeID); + EXPECT_EQ(entry.monitoredSubject, entry2.monitoredSubject); + + EXPECT_TRUE(entry2.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); +} + +TEST(TestICDMonitoringTable, TestEntryKeyFunctions) +{ + TestSessionKeystoreImpl keystore; + ICDMonitoringEntry entry(&keystore); + + // Test Setting Key + EXPECT_EQ(entry.SetKey(ByteSpan(kKeyBuffer1a)), CHIP_NO_ERROR); + + // Test Setting Key again + EXPECT_EQ(entry.SetKey(ByteSpan(kKeyBuffer1b)), CHIP_ERROR_INTERNAL); + + // Test Key Deletion + EXPECT_EQ(entry.DeleteKey(), CHIP_NO_ERROR); + + // Test Setting Key again + EXPECT_EQ(entry.SetKey(ByteSpan(kKeyBuffer1b)), CHIP_NO_ERROR); + + // Test Comparing Key + EXPECT_FALSE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); + + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); + + // Test Deleting Key + EXPECT_EQ(entry.DeleteKey(), CHIP_NO_ERROR); +} + +TEST(TestICDMonitoringTable, TestSaveAndLoadRegistrationValue) +{ + TestPersistentStorageDelegate storage; + TestSessionKeystoreImpl keystore; + ICDMonitoringTable saving(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); + ICDMonitoringTable loading(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); + ICDMonitoringEntry entry(&keystore); + + // Insert first entry + ICDMonitoringEntry entry1(&keystore); + entry1.checkInNodeID = kClientNodeId11; + entry1.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_NO_ERROR, entry1.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, saving.Set(0, entry1)); + + // Insert second entry + ICDMonitoringEntry entry2(&keystore); + entry2.checkInNodeID = kClientNodeId12; + entry2.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry2.SetKey(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(CHIP_NO_ERROR, saving.Set(1, entry2)); + + // Insert one too many + ICDMonitoringEntry entry3(&keystore); + entry3.checkInNodeID = kClientNodeId13; + entry3.monitoredSubject = kClientNodeId13; + EXPECT_EQ(CHIP_NO_ERROR, entry3.SetKey(ByteSpan(kKeyBuffer3a))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, saving.Set(2, entry3)); + + // Retrieve first entry + EXPECT_EQ(CHIP_NO_ERROR, loading.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId11, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId12, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Retrieve second entry + EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // No more entries + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, loading.Get(2, entry)); + EXPECT_EQ(2, loading.Limit()); + + // Remove first entry + saving.Remove(0); + + ICDMonitoringEntry entry4(&keystore); + entry4.checkInNodeID = kClientNodeId13; + entry4.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry4.SetKey(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(CHIP_NO_ERROR, saving.Set(1, entry4)); + + // Retrieve first entry (not modified but shifted) + EXPECT_EQ(CHIP_NO_ERROR, loading.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Retrieve second entry + EXPECT_EQ(CHIP_NO_ERROR, loading.Get(1, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId13, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(memcmp(entry4.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); +} + +TEST(TestICDMonitoringTable, TestSaveAllInvalidRegistrationValues) +{ + TestPersistentStorageDelegate storage; + TestSessionKeystoreImpl keystore; + ICDMonitoringTable table(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); + + // Invalid checkInNodeID + ICDMonitoringEntry entry1(&keystore); + entry1.checkInNodeID = kUndefinedNodeId; + entry1.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_NO_ERROR, entry1.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry1)); + + // Invalid monitoredSubject + ICDMonitoringEntry entry2(&keystore); + entry2.checkInNodeID = kClientNodeId11; + entry2.monitoredSubject = kUndefinedNodeId; + EXPECT_EQ(CHIP_NO_ERROR, entry2.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry2)); + + // Invalid key (empty) + ICDMonitoringEntry entry3(&keystore); + entry3.checkInNodeID = kClientNodeId11; + entry3.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, entry3.SetKey(ByteSpan())); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry3)); + + // Invalid key (too short) + ICDMonitoringEntry entry4(&keystore); + entry4.checkInNodeID = kClientNodeId11; + entry4.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, entry4.SetKey(ByteSpan(kKeyBuffer0a))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry4)); + + // Invalid key (too long) + ICDMonitoringEntry entry5(&keystore); + entry5.checkInNodeID = kClientNodeId11; + entry5.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, entry5.SetKey(ByteSpan(kKeyBuffer0b))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table.Set(0, entry5)); +} + +TEST(TestICDMonitoringTable, TestSaveLoadRegistrationValueForMultipleFabrics) +{ + TestPersistentStorageDelegate storage; + TestSessionKeystoreImpl keystore; + ICDMonitoringTable table1(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); + ICDMonitoringTable table2(storage, kTestFabricIndex2, kMaxTestClients2, &keystore); + ICDMonitoringEntry entry(&keystore); + + // Insert in first fabric + ICDMonitoringEntry entry1(&keystore); + entry1.checkInNodeID = kClientNodeId11; + entry1.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_NO_ERROR, entry1.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table1.Set(0, entry1)); + + // Insert in first fabric + ICDMonitoringEntry entry2(&keystore); + entry2.checkInNodeID = kClientNodeId12; + entry2.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry2.SetKey(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(CHIP_NO_ERROR, table1.Set(1, entry2)); + + // Insert in second fabric + ICDMonitoringEntry entry3(&keystore); + entry3.checkInNodeID = kClientNodeId21; + entry3.monitoredSubject = kClientNodeId22; + EXPECT_EQ(CHIP_NO_ERROR, entry3.SetKey(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(CHIP_NO_ERROR, table2.Set(0, entry3)); + + // Insert in second fabric (one too many) + ICDMonitoringEntry entry4(&keystore); + entry4.checkInNodeID = kClientNodeId22; + entry4.monitoredSubject = kClientNodeId21; + EXPECT_EQ(CHIP_NO_ERROR, entry4.SetKey(ByteSpan(kKeyBuffer2b))); + EXPECT_EQ(CHIP_ERROR_INVALID_ARGUMENT, table2.Set(1, entry4)); + + // Retrieve fabric1, first entry + + EXPECT_EQ(CHIP_NO_ERROR, table1.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId11, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId12, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Retrieve fabric1, second entry + EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Retrieve fabric2, first entry + EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex); + EXPECT_EQ(kClientNodeId21, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId22, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); +} + +TEST(TestICDMonitoringTable, TestDeleteValidEntryFromStorage) +{ + TestPersistentStorageDelegate storage; + TestSessionKeystoreImpl keystore; + ICDMonitoringTable table1(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); + ICDMonitoringTable table2(storage, kTestFabricIndex2, kMaxTestClients2, &keystore); + ICDMonitoringEntry entry(&keystore); + CHIP_ERROR err; + + // Insert in first fabric + ICDMonitoringEntry entry1(&keystore); + entry1.checkInNodeID = kClientNodeId11; + entry1.monitoredSubject = kClientNodeId12; + EXPECT_EQ(CHIP_NO_ERROR, entry1.SetKey(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(CHIP_NO_ERROR, table1.Set(0, entry1)); + + // Insert in first fabric + ICDMonitoringEntry entry2(&keystore); + entry2.checkInNodeID = kClientNodeId12; + entry2.monitoredSubject = kClientNodeId11; + EXPECT_EQ(CHIP_NO_ERROR, entry2.SetKey(ByteSpan(kKeyBuffer2a))); + err = table1.Set(1, entry2); + EXPECT_EQ(CHIP_NO_ERROR, err); + + // Insert in second fabric + ICDMonitoringEntry entry3(&keystore); + entry3.checkInNodeID = kClientNodeId21; + entry3.monitoredSubject = kClientNodeId22; + EXPECT_EQ(CHIP_NO_ERROR, entry3.SetKey(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(CHIP_NO_ERROR, table2.Set(0, entry3)); + + // Remove (invalid) + EXPECT_NE(CHIP_NO_ERROR, table1.Remove(2)); + + // Retrieve fabric1 + EXPECT_EQ(CHIP_NO_ERROR, table1.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId11, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId12, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); + EXPECT_EQ(memcmp(entry1.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Retrieve second entry (not modified) + EXPECT_EQ(CHIP_NO_ERROR, table1.Get(1, entry)); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Remove (existing) + EXPECT_EQ(CHIP_NO_ERROR, table1.Remove(0)); + + // Retrieve second entry (shifted down) + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, table1.Get(1, entry)); + + err = table1.Get(0, entry); + EXPECT_EQ(CHIP_NO_ERROR, err); + EXPECT_EQ(kTestFabricIndex1, entry.fabricIndex); + EXPECT_EQ(kClientNodeId12, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId11, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); + EXPECT_EQ(memcmp(entry2.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Retrieve fabric2, first entry + EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex); + EXPECT_EQ(kClientNodeId21, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId22, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Remove all (fabric 1) + EXPECT_EQ(CHIP_NO_ERROR, table1.RemoveAll()); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, table1.Get(0, entry)); + + // Check fabric 2 + EXPECT_EQ(CHIP_NO_ERROR, table2.Get(0, entry)); + EXPECT_EQ(kTestFabricIndex2, entry.fabricIndex); + EXPECT_EQ(kClientNodeId21, entry.checkInNodeID); + EXPECT_EQ(kClientNodeId22, entry.monitoredSubject); + EXPECT_TRUE(entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); + EXPECT_EQ(memcmp(entry3.hmacKeyHandle.As(), + entry.hmacKeyHandle.As(), sizeof(Crypto::Symmetric128BitsKeyByteArray)), + 0); + + // Remove all (fabric 2) + EXPECT_EQ(CHIP_NO_ERROR, table2.RemoveAll()); + EXPECT_EQ(CHIP_ERROR_NOT_FOUND, table2.Get(0, entry)); +} + +} // namespace diff --git a/src/app/tests/BUILD.gn b/src/app/tests/BUILD.gn index 78b9c8f69e87df..49196f2fdaaf8f 100644 --- a/src/app/tests/BUILD.gn +++ b/src/app/tests/BUILD.gn @@ -219,16 +219,6 @@ chip_test_suite_using_nltest("tests") { "${nlunit_test_root}:nlunit-test", ] - if (chip_enable_icd_server) { - public_deps += [ "${chip_root}/src/app/icd/server:manager" ] - - test_sources += [ "TestICDManager.cpp" ] - } - - if (chip_enable_icd_checkin) { - test_sources += [ "TestICDMonitoringTable.cpp" ] - } - if (chip_device_platform != "android") { test_sources += [ "TestExtensionFieldSets.cpp", @@ -240,9 +230,6 @@ chip_test_suite_using_nltest("tests") { ] } - # Do not run TestCommissionManager when running ICD specific unit tests. - # ICDManager has a dependency on the Accessors.h file which causes a link error - # when building the TestCommissionManager if (chip_config_network_layer_ble && (chip_device_platform == "linux" || chip_device_platform == "darwin")) { test_sources += [ "TestCommissionManager.cpp" ] diff --git a/src/app/tests/TestICDMonitoringTable.cpp b/src/app/tests/TestICDMonitoringTable.cpp deleted file mode 100644 index f5de7ed59ba3e1..00000000000000 --- a/src/app/tests/TestICDMonitoringTable.cpp +++ /dev/null @@ -1,493 +0,0 @@ -/* - * - * Copyright (c) 2022 Project CHIP Authors - * - * 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 -#include -#include -#include -#include -#include -#include - -#include - -using namespace chip; - -using TestSessionKeystoreImpl = Crypto::DefaultSessionKeystore; - -namespace { - -constexpr uint16_t kMaxTestClients1 = 2; -constexpr uint16_t kMaxTestClients2 = 1; -constexpr FabricIndex kTestFabricIndex1 = 1; -constexpr FabricIndex kTestFabricIndex2 = kMaxValidFabricIndex; -constexpr uint64_t kClientNodeId11 = 0x100001; -constexpr uint64_t kClientNodeId12 = 0x100002; -constexpr uint64_t kClientNodeId13 = 0x100003; -constexpr uint64_t kClientNodeId21 = 0x200001; -constexpr uint64_t kClientNodeId22 = 0x200002; - -constexpr uint8_t kKeyBuffer0a[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; -constexpr uint8_t kKeyBuffer0b[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - -constexpr uint8_t kKeyBuffer1a[] = { - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f -}; -constexpr uint8_t kKeyBuffer1b[] = { - 0xf1, 0xe1, 0xd1, 0xc1, 0xb1, 0xa1, 0x91, 0x81, 0x71, 0x61, 0x51, 0x14, 0x31, 0x21, 0x11, 0x01 -}; -constexpr uint8_t kKeyBuffer2a[] = { - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f -}; -constexpr uint8_t kKeyBuffer2b[] = { - 0xf2, 0xe2, 0xd2, 0xc2, 0xb2, 0xa2, 0x92, 0x82, 0x72, 0x62, 0x52, 0x42, 0x32, 0x22, 0x12, 0x02 -}; -constexpr uint8_t kKeyBuffer3a[] = { - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f -}; - -void TestEntryAssignationOverload(nlTestSuite * aSuite, void * aContext) -{ - TestSessionKeystoreImpl keystore; - ICDMonitoringEntry entry(&keystore); - - // Test Setting Key - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1a))); - - entry.fabricIndex = 2; - - NL_TEST_ASSERT(aSuite, !entry.IsValid()); - - entry.checkInNodeID = 34; - entry.monitoredSubject = 32; - - // Entry should be valid now - NL_TEST_ASSERT(aSuite, entry.IsValid()); - - ICDMonitoringEntry entry2; - - NL_TEST_ASSERT(aSuite, !entry2.IsValid()); - - entry2 = entry; - - NL_TEST_ASSERT(aSuite, entry2.IsValid()); - - NL_TEST_ASSERT(aSuite, entry2.fabricIndex == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, entry2.checkInNodeID == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, entry2.monitoredSubject == entry.monitoredSubject); - - NL_TEST_ASSERT(aSuite, entry2.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); -} - -void TestEntryKeyFunctions(nlTestSuite * aSuite, void * aContext) -{ - TestSessionKeystoreImpl keystore; - ICDMonitoringEntry entry(&keystore); - - // Test Setting Key - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1a))); - - // Test Setting Key again - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INTERNAL == entry.SetKey(ByteSpan(kKeyBuffer1b))); - - // Test Key Deletion - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.DeleteKey()); - - // Test Setting Key again - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.SetKey(ByteSpan(kKeyBuffer1b))); - - // Test Comparing Key - NL_TEST_ASSERT(aSuite, !entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - - // Test Deleting Key - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry.DeleteKey()); -} - -void TestSaveAndLoadRegistrationValue(nlTestSuite * aSuite, void * aContext) -{ - TestPersistentStorageDelegate storage; - TestSessionKeystoreImpl keystore; - ICDMonitoringTable saving(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); - ICDMonitoringTable loading(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); - ICDMonitoringEntry entry(&keystore); - CHIP_ERROR err; - - // Insert first entry - ICDMonitoringEntry entry1(&keystore); - entry1.checkInNodeID = kClientNodeId11; - entry1.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry1.SetKey(ByteSpan(kKeyBuffer1a))); - err = saving.Set(0, entry1); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert second entry - ICDMonitoringEntry entry2(&keystore); - entry2.checkInNodeID = kClientNodeId12; - entry2.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry2.SetKey(ByteSpan(kKeyBuffer2a))); - err = saving.Set(1, entry2); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert one too many - ICDMonitoringEntry entry3(&keystore); - entry3.checkInNodeID = kClientNodeId13; - entry3.monitoredSubject = kClientNodeId13; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry3.SetKey(ByteSpan(kKeyBuffer3a))); - err = saving.Set(2, entry3); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); - - // Retrieve first entry - err = loading.Get(0, entry); - - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry1.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Retrieve second entry - err = loading.Get(1, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // No more entries - err = loading.Get(2, entry); - NL_TEST_ASSERT(aSuite, 2 == loading.Limit()); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_NOT_FOUND == err); - - // Remove first entry - saving.Remove(0); - - ICDMonitoringEntry entry4(&keystore); - entry4.checkInNodeID = kClientNodeId13; - entry4.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry4.SetKey(ByteSpan(kKeyBuffer1b))); - err = saving.Set(1, entry4); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Retrieve first entry (not modified but shifted) - err = loading.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Retrieve second entry - err = loading.Get(1, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId13 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - NL_TEST_ASSERT(aSuite, - memcmp(entry4.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); -} - -void TestSaveAllInvalidRegistrationValues(nlTestSuite * aSuite, void * aContext) -{ - TestPersistentStorageDelegate storage; - TestSessionKeystoreImpl keystore; - ICDMonitoringTable table(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); - CHIP_ERROR err; - - // Invalid checkInNodeID - ICDMonitoringEntry entry1(&keystore); - entry1.checkInNodeID = kUndefinedNodeId; - entry1.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry1.SetKey(ByteSpan(kKeyBuffer1a))); - err = table.Set(0, entry1); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); - - // Invalid monitoredSubject - ICDMonitoringEntry entry2(&keystore); - entry2.checkInNodeID = kClientNodeId11; - entry2.monitoredSubject = kUndefinedNodeId; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry2.SetKey(ByteSpan(kKeyBuffer1a))); - err = table.Set(0, entry2); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); - - // Invalid key (empty) - ICDMonitoringEntry entry3(&keystore); - entry3.checkInNodeID = kClientNodeId11; - entry3.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == entry3.SetKey(ByteSpan())); - err = table.Set(0, entry3); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); - - // Invalid key (too short) - ICDMonitoringEntry entry4(&keystore); - entry4.checkInNodeID = kClientNodeId11; - entry4.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == entry4.SetKey(ByteSpan(kKeyBuffer0a))); - err = table.Set(0, entry4); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); - - // Invalid key (too long) - ICDMonitoringEntry entry5(&keystore); - entry5.checkInNodeID = kClientNodeId11; - entry5.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == entry5.SetKey(ByteSpan(kKeyBuffer0b))); - err = table.Set(0, entry5); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); -} - -void TestSaveLoadRegistrationValueForMultipleFabrics(nlTestSuite * aSuite, void * aContext) -{ - TestPersistentStorageDelegate storage; - TestSessionKeystoreImpl keystore; - ICDMonitoringTable table1(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); - ICDMonitoringTable table2(storage, kTestFabricIndex2, kMaxTestClients2, &keystore); - ICDMonitoringEntry entry(&keystore); - CHIP_ERROR err; - - // Insert in first fabric - ICDMonitoringEntry entry1(&keystore); - entry1.checkInNodeID = kClientNodeId11; - entry1.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry1.SetKey(ByteSpan(kKeyBuffer1a))); - err = table1.Set(0, entry1); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert in first fabric - ICDMonitoringEntry entry2(&keystore); - entry2.checkInNodeID = kClientNodeId12; - entry2.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry2.SetKey(ByteSpan(kKeyBuffer1b))); - err = table1.Set(1, entry2); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert in second fabric - ICDMonitoringEntry entry3(&keystore); - entry3.checkInNodeID = kClientNodeId21; - entry3.monitoredSubject = kClientNodeId22; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry3.SetKey(ByteSpan(kKeyBuffer2a))); - err = table2.Set(0, entry3); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert in second fabric (one too many) - ICDMonitoringEntry entry4(&keystore); - entry4.checkInNodeID = kClientNodeId22; - entry4.monitoredSubject = kClientNodeId21; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry4.SetKey(ByteSpan(kKeyBuffer2b))); - err = table2.Set(1, entry4); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_INVALID_ARGUMENT == err); - - // Retrieve fabric1, first entry - err = table1.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry1.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Retrieve fabric1, second entry - err = table1.Get(1, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - NL_TEST_ASSERT(aSuite, - memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Retrieve fabric2, first entry - err = table2.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex2 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId21 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId22 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry3.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); -} - -void TestDeleteValidEntryFromStorage(nlTestSuite * aSuite, void * context) -{ - TestPersistentStorageDelegate storage; - TestSessionKeystoreImpl keystore; - ICDMonitoringTable table1(storage, kTestFabricIndex1, kMaxTestClients1, &keystore); - ICDMonitoringTable table2(storage, kTestFabricIndex2, kMaxTestClients2, &keystore); - ICDMonitoringEntry entry(&keystore); - CHIP_ERROR err; - - // Insert in first fabric - ICDMonitoringEntry entry1(&keystore); - entry1.checkInNodeID = kClientNodeId11; - entry1.monitoredSubject = kClientNodeId12; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry1.SetKey(ByteSpan(kKeyBuffer1a))); - err = table1.Set(0, entry1); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert in first fabric - ICDMonitoringEntry entry2(&keystore); - entry2.checkInNodeID = kClientNodeId12; - entry2.monitoredSubject = kClientNodeId11; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry2.SetKey(ByteSpan(kKeyBuffer2a))); - err = table1.Set(1, entry2); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Insert in second fabric - ICDMonitoringEntry entry3(&keystore); - entry3.checkInNodeID = kClientNodeId21; - entry3.monitoredSubject = kClientNodeId22; - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == entry3.SetKey(ByteSpan(kKeyBuffer1b))); - err = table2.Set(0, entry3); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Remove (invalid) - err = table1.Remove(2); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR != err); - - // Retrieve fabric1 - err = table1.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry1.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Retrieve second entry (not modified) - err = table1.Get(1, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Remove (existing) - err = table1.Remove(0); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - // Retrieve second entry (shifted down) - err = table1.Get(1, entry); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_NOT_FOUND == err); - - err = table1.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex1 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId12 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId11 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer2a))); - NL_TEST_ASSERT(aSuite, - memcmp(entry2.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Retrieve fabric2, first entry - err = table2.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex2 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId21 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId22 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - NL_TEST_ASSERT(aSuite, - memcmp(entry3.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Remove all (fabric 1) - err = table1.RemoveAll(); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - err = table1.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_NOT_FOUND == err); - - // Check fabric 2 - err = table2.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - NL_TEST_ASSERT(aSuite, kTestFabricIndex2 == entry.fabricIndex); - NL_TEST_ASSERT(aSuite, kClientNodeId21 == entry.checkInNodeID); - NL_TEST_ASSERT(aSuite, kClientNodeId22 == entry.monitoredSubject); - NL_TEST_ASSERT(aSuite, entry.IsKeyEquivalent(ByteSpan(kKeyBuffer1b))); - NL_TEST_ASSERT(aSuite, - memcmp(entry3.hmacKeyHandle.As(), - entry.hmacKeyHandle.As(), - sizeof(Crypto::Symmetric128BitsKeyByteArray)) == 0); - - // Remove all (fabric 2) - err = table2.RemoveAll(); - NL_TEST_ASSERT(aSuite, CHIP_NO_ERROR == err); - - err = table2.Get(0, entry); - NL_TEST_ASSERT(aSuite, CHIP_ERROR_NOT_FOUND == err); -} - -} // namespace - -/** - * Set up the test suite. - */ -int Test_Setup(void * inContext) -{ - return SUCCESS; -} - -int TestClientMonitoringRegistrationTable() -{ - static nlTest sTests[] = { NL_TEST_DEF("TestEntryKeyFunctions", TestEntryKeyFunctions), - NL_TEST_DEF("TestEntryAssignationOverload", TestEntryAssignationOverload), - NL_TEST_DEF("TestSaveAndLoadRegistrationValue", TestSaveAndLoadRegistrationValue), - NL_TEST_DEF("TestSaveAllInvalidRegistrationValues", TestSaveAllInvalidRegistrationValues), - NL_TEST_DEF("TestSaveLoadRegistrationValueForMultipleFabrics", - TestSaveLoadRegistrationValueForMultipleFabrics), - NL_TEST_DEF("TestDeleteValidEntryFromStorage", TestDeleteValidEntryFromStorage), - NL_TEST_SENTINEL() }; - - nlTestSuite cmSuite = { "TestClientMonitoringRegistrationTable", &sTests[0], &Test_Setup, nullptr }; - - nlTestRunner(&cmSuite, nullptr); - return (nlTestRunnerStats(&cmSuite)); -} - -CHIP_REGISTER_TEST_SUITE(TestClientMonitoringRegistrationTable) diff --git a/src/inet/tests/TestInetCommonPosix.cpp b/src/inet/tests/TestInetCommonPosix.cpp index 71437913819c24..9d5e4588979d1a 100644 --- a/src/inet/tests/TestInetCommonPosix.cpp +++ b/src/inet/tests/TestInetCommonPosix.cpp @@ -71,8 +71,13 @@ using namespace chip::Inet; System::LayerImpl gSystemLayer; +#if INET_CONFIG_ENABLE_UDP_ENDPOINT Inet::UDPEndPointManagerImpl gUDP; +#endif + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT Inet::TCPEndPointManagerImpl gTCP; +#endif #if CHIP_SYSTEM_CONFIG_USE_LWIP && !(CHIP_SYSTEM_CONFIG_LWIP_SKIP_INIT) static sys_mbox_t * sLwIPEventQueue = NULL; @@ -329,9 +334,12 @@ void InitNetwork() AcquireLwIP(); #endif // CHIP_SYSTEM_CONFIG_USE_LWIP && !(CHIP_SYSTEM_CONFIG_LWIP_SKIP_INIT) - +#if INET_CONFIG_ENABLE_TCP_ENDPOINT gTCP.Init(gSystemLayer); +#endif +#if INET_CONFIG_ENABLE_TCP_ENDPOINT gUDP.Init(gSystemLayer); +#endif } void ServiceEvents(uint32_t aSleepTimeMilliseconds) @@ -413,17 +421,21 @@ static void OnLwIPInitComplete(void * arg) void ShutdownNetwork() { + +#if INET_CONFIG_ENABLE_TCP_ENDPOINT gTCP.ForEachEndPoint([](TCPEndPoint * lEndPoint) -> Loop { gTCP.ReleaseEndPoint(lEndPoint); return Loop::Continue; }); gTCP.Shutdown(); - +#endif +#if INET_CONFIG_ENABLE_UDP_ENDPOINT gUDP.ForEachEndPoint([](UDPEndPoint * lEndPoint) -> Loop { gUDP.ReleaseEndPoint(lEndPoint); return Loop::Continue; }); gUDP.Shutdown(); +#endif #if CHIP_SYSTEM_CONFIG_USE_LWIP && !(CHIP_SYSTEM_CONFIG_LWIP_SKIP_INIT) ReleaseLwIP(); #endif diff --git a/src/test_driver/openiotsdk/unit-tests/test_components.txt b/src/test_driver/openiotsdk/unit-tests/test_components.txt index e6e64c61106c9a..5887de730725df 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components.txt @@ -17,3 +17,4 @@ SetupPayloadTests SupportTests UserDirectedCommissioningTests SecureChannelTests +ICDServerTests diff --git a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt index 93c9c1389e0a5b..e3d66b49d3f644 100644 --- a/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt +++ b/src/test_driver/openiotsdk/unit-tests/test_components_nl.txt @@ -1,5 +1,6 @@ AppTests DataModelTests +ICDServerTestsNL InetLayerTests MessagingLayerTests SecureChannelTestsNL diff --git a/src/transport/raw/tests/NetworkTestHelpers.cpp b/src/transport/raw/tests/NetworkTestHelpers.cpp index 5d967ebed3d2fc..a4cd6329975c0e 100644 --- a/src/transport/raw/tests/NetworkTestHelpers.cpp +++ b/src/transport/raw/tests/NetworkTestHelpers.cpp @@ -35,10 +35,13 @@ CHIP_ERROR IOContext::Init() InitSystemLayer(); InitNetwork(); - mSystemLayer = &gSystemLayer; + mSystemLayer = &gSystemLayer; +#if INET_CONFIG_ENABLE_TCP_ENDPOINT mTCPEndPointManager = &gTCP; +#endif +#if INET_CONFIG_ENABLE_UDP_ENDPOINT mUDPEndPointManager = &gUDP; - +#endif return err; }